MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comportement étrange du fournisseur MongoDB LINQ pour les champs appelés id

MongoDB exige que chaque document stocké dans la base de données ait un champ (au niveau racine) appelé "_id".

Le pilote C# suppose que tout champ de votre classe appelé "Id", "id" ou "_id" est destiné à être mappé sur le champ spécial "_id". Il s'agit d'une convention, qui peut être outrepassée. Le pilote C# ne sait pas que votre classe Result n'est pas destinée à être utilisée comme document racine d'une collection, il trouve donc votre champ "id" et le mappe à "_id" dans la base de données.

Une façon de remplacer cela consiste à changer le nom du champ dans votre classe (comme vous l'avez découvert). Ce que vous pouvez également faire est d'utiliser l'attribut [BsonElement] pour mapper votre nom de champ C# (par exemple "idd") à n'importe quel nom réellement utilisé dans la base de données (par exemple "id"). Par exemple :

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

Une autre alternative consiste à remplacer la convention qui trouve le membre "Id" d'une classe pour supprimer le comportement par défaut du pilote C# pour votre classe Result. Vous pouvez le faire en enregistrant un nouveau ConventionProfile pour votre classe de résultats. Par exemple :

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

Vous devez vous assurer de le faire très tôt dans votre programme, avant que votre classe Result ne soit mappée.