MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Strano comportamento del provider MongoDB LINQ per i campi chiamati id

MongoDB richiede che ogni documento archiviato nel database abbia un campo (a livello di root) chiamato "_id".

Il driver C# presuppone che qualsiasi campo della classe denominato "Id", "id" o "_id" debba essere mappato al campo speciale "_id". Questa è una convenzione, che può essere ignorata. Il driver C# non sa che la tua classe Result non è pensata per essere usata come documento radice di una raccolta, quindi trova il tuo campo "id" e lo associa a "_id" nel database.

Un modo per ignorarlo è cambiare il nome del campo nella tua classe (come hai scoperto). Ciò che puoi anche fare è utilizzare l'attributo [BsonElement] per mappare il nome del tuo campo C# (ad es. "idd") a qualsiasi nome venga effettivamente utilizzato nel database (ad es. "id"). Ad esempio:

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

Un'altra alternativa consiste nell'overridere la convenzione che trova il membro "Id" di una classe per eliminare il comportamento predefinito del driver C# per la classe Result. Puoi farlo registrando un nuovo ConventionProfile per la tua classe Result. Ad esempio:

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

Devi assicurarti di farlo molto presto nel tuo programma, prima che la tua classe dei risultati venga mappata.