padavan
padavan

Reputation: 884

MongoDB C# GUID is not supported in Dictionary or its BUG Driver

I found a strange thing: when updating a document, if a field contains a Dictionary<GUID, *>, an exception occurs. I'm using driver version 3.1.0.

Code:

BsonSerializer.TryRegisterSerializer(new GuidSerializer(BsonType.String));

Doc:

public class Lib
{
    public Dictionary<Guid, GameLib> Games { get; set; } = [];
    public Dictionary<string, GameLib> GamesX { get; set; } = [];
}

Request with Dictionary<Guid, *>:

var uu = Builders<Lib>.Update.Set(f => f.Games[gameId].Status, GameLibStatus.Backlog);

This code throws this error:

MongoDB.Driver.Linq.ExpressionNotSupportedException: Expression not supported: f.Games.get_Item(229341dc-7125-4093-b407-7092245c7d9b).

at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.GetItemMethodToFilterFieldTranslator.Translate(TranslationContext context, Expression expression, MethodInfo method, Expression fieldExpression, ReadOnlyCollection1 arguments) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.GetItemMethodToFilterFieldTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.MethodCallExpressionToFilterFieldTranslator.Translate(TranslationContext context, MethodCallExpression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.ExpressionToFilterFieldTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.MemberExpressionToFilterFieldTranslator.Translate(TranslationContext context, MemberExpression memberExpression) at MongoDB.Driver.Linq.Linq3Implementation.Translators.ExpressionToFilterTranslators.ToFilterFieldTranslators.ExpressionToFilterFieldTranslator.Translate(TranslationContext context, Expression expression) at MongoDB.Driver.Linq.LinqProviderAdapter.TranslateExpressionToField[TDocument,TField](Expression1 expression, IBsonSerializer1 documentSerializer, IBsonSerializerRegistry serializerRegistry, ExpressionTranslationOptions translationOptions, Boolean allowScalarValueForArrayField) at MongoDB.Driver.ExpressionFieldDefinition2.Render(RenderArgs1 args) at MongoDB.Driver.OperatorUpdateDefinition2.Render(RenderArgs1 args) at MongoDB.Driver.CombinedUpdateDefinition1.Render(RenderArgs1 args) at MongoDB.Driver.MongoCollectionImpl1.ConvertWriteModelToWriteRequest(WriteModel1 model, Int32 index, RenderArgs1 renderArgs)
at MongoDB.Driver.MongoCollectionImpl1.<>c__DisplayClass83_0.<CreateBulkWriteOperation>b__0(WriteModel1 model, Int32 index)
at System.Linq.Enumerable.SelectIterator[TSource,TResult](IEnumerable1 source, Func3 selector)+MoveNext()
at System.Collections.Generic.List1..ctor(IEnumerable1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation..ctor(CollectionNamespace collectionNamespace, IEnumerable1 requests, MessageEncoderSettings messageEncoderSettings)
at MongoDB.Driver.MongoCollectionImpl1.CreateBulkWriteOperation(IClientSessionHandle session, IEnumerable1 requests, BulkWriteOptions options, RenderArgs1 renderArgs) at MongoDB.Driver.MongoCollectionImpl1.BulkWriteAsync(IClientSessionHandle session, IEnumerable1 requests, BulkWriteOptions options, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionImpl1.UsingImplicitSessionAsync[TResult](Func2 funcAsync, CancellationToken cancellationToken) at MongoDB.Driver.MongoCollectionBase1.UpdateOneAsync(FilterDefinition1 filter, UpdateDefinition1 update, UpdateOptions options, Func`3 bulkWriteAsync)

But when I use Dictionary<string, *> all works fine:

var uu = Builders<Lib>.Update.Set(f => f.GamesX[gameId.ToString()].Status, G

Upvotes: 0

Views: 58

Answers (0)

Related Questions