[CSHARP-1238] FindOneAndUpdateAsync fails on deserialization with custom discriminator Created: 11/Apr/15  Updated: 05/Apr/19  Resolved: 04/Apr/16

Status: Closed
Project: C# Driver
Component/s: Serialization
Affects Version/s: 2.0
Fix Version/s: None

Type: Task Priority: Major - P3
Reporter: Vyacheslav Stroy Assignee: Unassigned
Resolution: Done Votes: 0
Labels: question
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Windows 8.1 x64
MongoDB version: v2.6.5



 Description   

I have custom discriminator inherited from IDiscriminatorConvention. It adds type discriminator element (i.e. {"_t":8}) to all saved instances.

FindOneAndUpdateAsync methods throws deserialization exception:

System.AggregateException : One or more errors occurred.
----> MongoDB.Bson.BsonSerializationException : Unknown discriminator value '2'.

Fluent Find method deserializes instances without any problem respecting my discriminator convention.

Detailed stack trace:

System.AggregateException : One or more errors occurred.
  ----> MongoDB.Bson.BsonSerializationException : Unknown discriminator value '2'.
Result StackTrace:	
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at System.Threading.Tasks.Task`1.get_Result()
at MongoConnect.Extensions.RunSync[T](Task`1 task) in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect\Utl\Extensions.cs:line 14
at MongoConnect.MongoDbProvider.UpdatePropertyInternal(UpdateOperation op, IPersistentObject obj, String propertyName, Object value) in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect\Providers\MongoDbProvider.cs:line 123
at MongoConnect.MongoDbProvider.IncrementProperty(IPersistentObject obj, String propertyName, Int32 increment) in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect\Providers\MongoDbProvider.cs:line 93
at MongoConnect.BaseDataObject.IncrementProperty(String propertyName, Int32 value) in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect\BasicObjects\BaseDataObject.cs:line 229
at MongoConnect.BaseDataObject.IncrementProperty[T](Expression`1 expression, Int32 value) in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect\BasicObjects\BaseDataObject.cs:line 256
at MongoConnect.Tests.AtomicUpdateTests.IncrementPropertyTest() in c:\dev\MongoConnectPrev\MongoConnect\MongoConnect.Tests\DB\AtomicUpdateTests.cs:line 31
--BsonSerializationException
at MongoDB.Bson.Serialization.BsonSerializer.LookupActualType(Type nominalType, BsonValue discriminator) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\BsonSerializer.cs:line 328
at MongoDB.Bson.Serialization.Conventions.ObjectDiscriminatorConvention.GetActualType(IBsonReader bsonReader, Type nominalType) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\Conventions\ObjectDiscriminatorConvention.cs:line 125
at MongoDB.Bson.Serialization.Serializers.DiscriminatedInterfaceSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\Serializers\DiscriminatedInterfaceSerializer.cs:line 80
at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\IBsonSerializerExtensions.cs:line 48
at MongoDB.Driver.Core.Operations.ElementDeserializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Driver.Core\Core\Operations\ElementDeserializer.cs:line 64
at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\IBsonSerializerExtensions.cs:line 48
at MongoDB.Driver.Core.Operations.FindAndModifyValueDeserializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Driver.Core\Core\Operations\FindAndModifyValueDeserializer.cs:line 44
at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Bson\Serialization\IBsonSerializerExtensions.cs:line 48
at MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.ProcessReply(ConnectionId connectionId, ReplyMessage`1 reply) in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Driver.Core\Core\WireProtocol\CommandWireProtocol.cs:line 104
at MongoDB.Driver.Core.WireProtocol.CommandWireProtocol`1.<ExecuteAsync>d__0.MoveNext() in d:\jenkins\workspace\mongo-csharp-driver-build\src\MongoDB.Driver.Core\Core\WireProtocol\CommandWireProtocol.cs:line 98



 Comments   
Comment by Vyacheslav Stroy [ 11/Apr/15 ]

Hi Craig,

Unfortunately I haven't saved original code. After I stuck with this problem I solved it using Projection and overloaded method that just returned me updated value as BsonDocument.

Originally it was something like the following (simplified)

var update = new BsonDocument(operation, new BsonDocument("element", BsonDocumentWrapper.Create(value)));
var options = new FindOneAndUpdateOptions() { 
    IsUpsert = false, 
    ReturnDocument = MongoDB.Driver.ReturnDocument.After };
var collection = db.GetCollection<IPersistentObject>("SomeCollection");
var result = collection.FindOneAndUpdateAsync(new BsonDocument("_id", id), update, options).RunSync();

I'm sorry but I can't provide the full solution code. Discriminator class itself is useless because it is tightly bounded with all other metadata and internal logic stuff.

Comment by Craig Wilson [ 11/Apr/15 ]

Hi Vyacheslav,

Sorry you are having trouble. If you could provide a little repro (a console app), that would go a long way into helping us figure out the issue.

Craig

Generated at Wed Feb 07 21:39:02 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.