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

Comportamento estranho do provedor MongoDB LINQ para campos chamados id


O MongoDB requer que todo documento armazenado no banco de dados tenha um campo (no nível raiz) chamado "_id".

O driver C# assume que qualquer campo em sua classe chamado "Id", "id" ou "_id" deve ser mapeado para o campo especial "_id". Esta é uma convenção, que pode ser substituída. O driver C# não sabe que sua classe Result não deve ser usada como o documento raiz de uma coleção, então ele encontra seu campo "id" e o mapeia para "_id" no banco de dados.

Uma maneira de substituir isso é alterar o nome do campo em sua classe (como você descobriu). O que você também pode fazer é usar o atributo [BsonElement] para mapear seu nome de campo C# (por exemplo, "idd") para qualquer nome que esteja realmente sendo usado no banco de dados (por exemplo, "id"). Por exemplo:
public class Result
{
    [BsonElement("id")]
    public int idd; // matches "id" in the database
    // other fields
}

Outra alternativa é substituir a convenção que localiza o membro "Id" de uma classe para suprimir o comportamento padrão do driver C# para sua classe Result. Você pode fazer isso registrando um novo ConventionProfile para sua classe Result. Por exemplo:
var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));

Você deve ter certeza de fazer isso muito cedo em seu programa, antes que sua classe Result seja mapeada.