System.FormatException: An error occurred while deserializing the Id property of class X : Cannot deserialize a 'String' from BsonType 'ObjectId'.
where X is a root class for 2 Полученные классы A & b :
Код: Выделить всё
public class X
{
// MongoDB ObjectId
public string Id { get; set; }
// Other common properties...
}
public class A : X
{
// Stuff... but without ID (it is inherited from X)
}
public class B : X
{
// Stuff... but without ID (it is inherited from X)
}
Это исключение будет продолжаться до тех пор, пока приложение не будет перезагружено, что заставляет его снова работать в течение нескольких дней.
mongodb.driver версии v3.4.0 , версия сервера v4.2.8 .
[list]
[*]. Используется.
[*] Карты классов зарегистрированы в статическом конструкторе.
[*] Вставленные документы имеют правильный дискриминатор _t: [x, a (или b)] , означающее, что это массив. Я следовал этому веб -руководству для полиморфизма в mongodb < /li>
TDocument может быть только x . Это означает, что порядок регистрации карты класса -x -> a/b -> b/a .
[*] Наша обертка Mongo -это Singleton.static MongoWrapper()
{
BsonSerializer.TryRegisterSerializer(new GuidSerializer(GuidRepresentation.CSharpLegacy));
RegisterClassMap(typeof(TDocument), "Id");
// not ideal -- I know
var derivedTypes = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(assembly => assembly.GetLoadableTypes())
.Where(type => type is not null && !type.IsAbstract && type.IsSubclassOf(typeof(TDocument)));
foreach (var derivedType in derivedTypes)
{
RegisterClassMap(derivedType, "Id");
}
ConventionRegistry.Register(
"DocumentStorage.IgnoreExtraElements",
new ConventionPack() { new IgnoreExtraElementsConvention(true) },
type => true
);
ConventionRegistry.Register(
"DocumentStorage.IgnoreNull",
new ConventionPack { new IgnoreIfNullConvention(true) },
type => true
);
}
private static void RegisterClassMap(Type classType, string idPropertyName)
{
if (classType.BaseType != typeof(object) && !BsonClassMap.IsClassMapRegistered(classType.BaseType))
RegisterClassMap(classType.BaseType, idPropertyName);
else if (classType is null || classType == typeof(object))
return;
if (!BsonClassMap.IsClassMapRegistered(classType))
{
var baseMap = BsonClassMap.IsClassMapRegistered(classType.BaseType)
? BsonClassMap.LookupClassMap(classType.BaseType)
: null;
var classMap = new BsonClassMap(classType, baseMap);
classMap.AutoMap();
classMap.SetIgnoreExtraElements(true);
if (classMap.BaseClassMap?.IdMemberMap is null)
{
classMap.SetIsRootClass(true);
classMap.MapIdProperty(idPropertyName)
.SetSerializer(new StringSerializer(BsonType.ObjectId))
.SetIdGenerator(StringObjectIdGenerator.Instance)
.SetIgnoreIfNull(false)
.SetIgnoreIfDefault(true);
}
classMap.Freeze();
BsonClassMap.RegisterClassMap(classMap);
}
}
< /code>
Ни один другой класс не манипулирует MongoDB, и только одно место регистрирует карты класса. Документы хранятся с удостоверением личности. Даже за исключением, которые происходят, документы все еще хранятся с идентификатором.var collection = database.GetCollection("XCollection").OfType();
var data = await collection.Find().ToListAsync()
< /code>
полностью потерян, < /p>
Кто -то столкнулся с той же проблемой и смог найти решение? Отсутствует? Deserialize идентификационный свойство x (хотя это работало только несколько минут ранее)
[/list]
Полное исключение:
System.FormatException: An error occurred while deserializing the Id property of class X: Cannot deserialize a 'String' from BsonType 'ObjectId'.
---> System.FormatException: Cannot deserialize a 'String' from BsonType 'ObjectId'.
at MongoDB.Bson.Serialization.Serializers.StringSerializer.DeserializeValue(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
--- End of inner exception stack trace ---
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeMemberValue(BsonDeserializationContext context, BsonMemberMap memberMap)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.DeserializeClass(BsonDeserializationContext context)
at MongoDB.Bson.Serialization.BsonClassMapSerializer`1.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Driver.OfTypeSerializer`2.Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
at MongoDB.Bson.Serialization.IBsonSerializerExtensions.Deserialize[TValue](IBsonSerializer`1 serializer, BsonDeserializationContext context)
at MongoDB.Driver.Core.Operations.CursorBatchDeserializationHelper.DeserializeBatch[TDocument](RawBsonArray batch, IBsonSerializer`1 documentSerializer, MessageEncoderSettings messageEncoderSettings)
at MongoDB.Driver.Core.Operations.FindOperation`1.CreateFirstCursorBatch(BsonDocument cursorDocument)
at MongoDB.Driver.Core.Operations.FindOperation`1.CreateCursor(IChannelSourceHandle channelSource, IChannelHandle channel, BsonDocument commandResult)
at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(RetryableReadContext context, CancellationToken cancellationToken)
at MongoDB.Driver.Core.Operations.FindOperation`1.ExecuteAsync(IReadBinding binding, CancellationToken cancellationToken)
at MongoDB.Driver.OperationExecutor.ExecuteReadOperationAsync[TResult](IReadBinding binding, IReadOperation`1 operation, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.ExecuteReadOperationAsync[TResult](IClientSessionHandle session, IReadOperation`1 operation, ReadPreference readPreference, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
Подробнее здесь: https://stackoverflow.com/questions/797 ... ntype-obje