sql >> Base de Datos >  >> NoSQL >> MongoDB

Comportamiento extraño del proveedor MongoDB LINQ para campos llamados id

MongoDB requiere que cada documento almacenado en la base de datos tenga un campo (en el nivel raíz) llamado "_id".

El controlador de C# asume que cualquier campo de su clase llamado "Id", "id" o "_id" debe asignarse al campo especial "_id". Esta es una convención, una que puede ser anulada. El controlador de C# no sabe que su clase Result no debe usarse como el documento raíz de una colección, por lo que encuentra su campo "id" y lo asigna a "_id" en la base de datos.

Una forma de anular esto es cambiar el nombre del campo en su clase (como descubrió). Lo que también puede hacer es usar el atributo [BsonElement] para asignar su nombre de campo C# (por ejemplo, "idd") a cualquier nombre que se esté usando en la base de datos (por ejemplo, "id"). Por ejemplo:

public class Result
{
    [BsonElement("id")]
    public int idd; // matches "id" in the database
    // other fields
}

Otra alternativa es anular la convención que encuentra el miembro "Id" de una clase para suprimir el comportamiento predeterminado del controlador C# para su clase Result. Puede hacerlo registrando un nuevo ConventionProfile para su clase de resultado. Por ejemplo:

var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));

Debe asegurarse de hacer esto muy temprano en su programa, antes de que se asigne su clase de resultado.