MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O elemento 'id' não corresponde a nenhum campo ou propriedade de erro com classes aninhadas


Para encurtar a história:é tudo sobre convenções. O driver MongoDB .NET expõe a classe estática ConventionRegistry que permite que você registre suas próprias convenções (mais aqui ). Além disso, existem duas convenções "incorporadas" __defaults__ e __attributes__ . Indo mais fundo (driver github ) você pode descobrir que ele registra uma convenção bastante interessante:
new NamedIdMemberConvention(new [] { "Id", "id", "_id" })

O que significa que id membros serão considerados como elementos BSON _id regulares.

Como consertar isso?

Você pode se livrar das convenções padrão
ConventionRegistry.Remove("__defaults__");

No entanto, automaticamente você descartará todas as outras convenções de driver, o que é bastante arriscado. Alternativamente, você pode criar uma propriedade falsa que sempre estará vazia:
public class SubServiceDef
{
    [BsonElement("id")]
    public int Id { get; set; }

    [BsonId]
    public ObjectId FakeId { get; set; }
}

ou você pode simplesmente usar BsonNoId atributo que
[BsonNoId]
public class SubServiceDef
{
    [BsonElement("id")]
    public int Id { get; set; }
}

Portanto, a convenção definirá seu id como IdMember no mapa de classes, mas durante o pós-processamento esse atributo forçará IdMember a ser nulo e sua classe será desserializada com sucesso