After updating a big project from MongoDb C# driver 2.7 to latest 2.10 version I started having lots of error on Integration tests.
MongoDB.Bson.BsonSerializationException HResult=0x80131500 Message=Creator map for class TestMongoBug.TestArray has 2 arguments, but none are configured. Source=MongoDB.Bson StackTrace: at MongoDB.Bson.Serialization.BsonCreatorMap.Freeze() at MongoDB.Bson.Serialization.BsonClassMap.Freeze() 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)
The stack trace is especially strange, because it reveals that the error happens when the BsonClkassMap is trying to create mapping for the object. The error message is also really strange
Creator map for class has 2 arguments, but none are configured.
This points me to some error in constructors of the class and after some tests I’ve managed to understand what is the code that triggered the error.
If you look closely to line 3 (the constructor) you can notice that it accepts a parameter called values of type IEnumerable and the class has a property called Values of type String. The problem was probably due (I didn’t check driver’s code) to a combination of
- Value property has private setter
- In the constructor the type is different
Confirmation of the theory is simple, if I make setter public the error is gone, if I use the very same type (string) for value param in the constructor the error is also gone.
The annoying stuff is that the code was in production for YEARS and I have TONS of C# classes serialized into MongoDb with 2.7 version of the driver, now all my tests are green (after I fixed 5 classes with these problems), but in my opinion this is a bug or at least a regression.
If you encounter the very same error you have another way to solve this problem, manually map the class with BsonClassMap.RegisterClassMap mapping everything without calling AutoMap.