[CSHARP-2675] ArgumentOutOfRangeException when inserting document with subdocument that extends class without adding any properties Created: 01/Aug/19  Updated: 10/Nov/22  Resolved: 10/Nov/22

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

Type: Bug Priority: Major - P3
Reporter: John Knoop Assignee: James Kovacs
Resolution: Duplicate Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

.NET Core 2.2 running in a Linux container


Issue Links:
Duplicate
duplicates CSHARP-1996 Subclass with no additional propertie... Closed

 Description   

Here is my object model

public class Course
{
    public Course(string name, Teacher teacher)
    {
        Name = name;
        CourseTeacher = teacher;
    }
 
    public string Name { get; private set; }
    public Teacher CourseTeacher { get; private set; }
}
public class Teacher
{
    public Teacher(string name)
    {
        Name = name;
    }
 
     public string Name { get; private set; }
}
public class SubstituteTeacher : Teacher
{
    public SubstituteTeacher(string name) : base(name)
    {
    }
}

 

When I call InsertOneAsync like this:

var course = new Course("Math", new SubstituteTeacher("Larry Smith"));
await collection.InsertOneAsync(course);

I get this error:

System.ArgumentOutOfRangeException
 HResult=0x80131502
 Message=The memberInfo argument must be for class SubstituteTeacher, but was for class Teacher.
Parameter name: memberInfo
 Source=MongoDB.Bson
 StackTrace:
 at MongoDB.Bson.Serialization.BsonClassMap.EnsureMemberInfoIsForThisClass(MemberInfo memberInfo)
 at MongoDB.Bson.Serialization.BsonClassMap.MapMember(MemberInfo memberInfo)
 at MongoDB.Bson.Serialization.Conventions.ImmutableTypeClassMapConvention.Apply(BsonClassMap classMap)
 at MongoDB.Bson.Serialization.Conventions.ConventionRunner.Apply(BsonClassMap classMap)
 at MongoDB.Bson.Serialization.BsonClassMap.AutoMapClass()
 at MongoDB.Bson.Serialization.BsonClassMap.LookupClassMap(Type classType)
 at MongoDB.Bson.Serialization.BsonClassMapSerializationProvider.GetSerializer(Type type, IBsonSerializerRegistry serializerRegistry)
 at MongoDB.Bson.Serialization.BsonSerializerRegistry.CreateSerializer(Type type)
 at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
 at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TClass value)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, Object value)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Serialize(IBsonSerializer serializer, BsonSerializationContext context, Object value)
 at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.SerializeClass(BsonSerializationContext context, BsonSerializationArgs args, TClass document)
 at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TClass value)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, Object value)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Serialize(IBsonSerializer serializer, BsonSerializationContext context, Object value)
 at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TBsonValue value)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, Object value)
 at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Serialize(IBsonSerializer serializer, BsonSerializationContext context, Object value)
 at MongoDB.Bson.Serialization.Serializers.BsonValueSerializerBase`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TBsonValue value)
 at MongoDB.Driver.Core.Operations.BulkInsertOperation.InsertRequestSerializer.SerializeValue(BsonSerializationContext context, BsonSerializationArgs args, InsertRequest value)
 at MongoDB.Bson.Serialization.Serializers.SealedClassSerializerBase`1.Serialize(BsonSerializationContext context, BsonSerializationArgs args, TValue value)
 at MongoDB.Bson.Serialization.Serializers.SerializerBase`1.MongoDB.Bson.Serialization.IBsonSerializer.Serialize(BsonSerializationContext context, BsonSerializationArgs args, Object value)
 at MongoDB.Driver.Core.WireProtocol.Messages.Encoders.BinaryEncoders.CommandMessageBinaryEncoder.WriteType1Section(BsonBinaryWriter writer, Type1CommandMessageSection section, Int64 messageStartPosition)
 at MongoDB.Driver.Core.WireProtocol.Messages.Encoders.BinaryEncoders.CommandMessageBinaryEncoder.WriteSections(BsonBinaryWriter writer, IEnumerable`1 sections, Int64 messageStartPosition)
 at MongoDB.Driver.Core.WireProtocol.Messages.Encoders.BinaryEncoders.CommandMessageBinaryEncoder.WriteMessage(CommandMessage message)
 at MongoDB.Driver.Core.Connections.BinaryConnection.SendMessagesHelper.EncodeMessages(CancellationToken cancellationToken)
 at MongoDB.Driver.Core.Connections.BinaryConnection.<SendMessagesAsync>d__58.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.Core.WireProtocol.CommandUsingCommandMessageWireProtocol`1.<ExecuteAsync>d__13.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.Core.Servers.Server.ServerChannel.<ExecuteProtocolAsync>d__29`1.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.Core.Operations.RetryableWriteOperationExecutor.<ExecuteAsync>d__3`1.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.<ExecuteBatchAsync>d__46.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at MongoDB.Driver.Core.Operations.BulkUnmixedWriteOperationBase`1.<ExecuteBatchesAsync>d__48.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.<ExecuteBatchAsync>d__51.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at MongoDB.Driver.Core.Operations.BulkMixedWriteOperation.<ExecuteAsync>d__44.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.OperationExecutor.<ExecuteWriteOperationAsync>d__5`1.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.MongoCollectionImpl`1.<ExecuteWriteOperationAsync>d__95`1.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.MongoCollectionImpl`1.<BulkWriteAsync>d__26.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.MongoCollectionImpl`1.<UsingImplicitSessionAsync>d__101`1.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at MongoDB.Driver.MongoCollectionBase`1.<InsertOneAsync>d__70.MoveNext()
 at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at JohnKnoop.MongoRepository.ManualTesting.Program.<Main>d__0.MoveNext() in C:\work\JohnKnoop.MongoRepository.ManualTesting\Program.cs:line 132

However, if I add a property to the SubstituteTeacher class, then the InsertOneAsync call completed without error:

public class SubstituteTeacher : Teacher {
    public SubstituteTeacher(string name) : base(name) {
    }
    
    public string AdditionalProperty { get; private set; }
}



 Comments   
Comment by James Kovacs [ 10/Nov/22 ]

Due to refactorings and changes in the code base, this bug is no longer present in the current driver. If you encounter this issue again, please re-open this issue along with details on how to reproduce.

Comment by John Knoop [ 02/Aug/20 ]

It's now been a year since I reported this. Have you had a chance to look at it? While I discovered an easy workaround, it would still be nice to get rid of this bug.

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