MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Seltsames Verhalten des MongoDB-LINQ-Anbieters für Felder namens id

MongoDB erfordert, dass jedes in der Datenbank gespeicherte Dokument ein Feld (auf Stammebene) namens „_id“ hat.

Der C#-Treiber geht davon aus, dass jedes Feld in Ihrer Klasse namens „Id“, „id“ oder „_id“ dem speziellen Feld „_id“ zugeordnet werden soll. Dies ist eine Konvention, die außer Kraft gesetzt werden kann. Der C#-Treiber weiß nicht, dass Ihre Ergebnisklasse nicht als Stammdokument einer Sammlung verwendet werden soll, also findet er Ihr „id“-Feld und ordnet es „_id“ in der Datenbank zu.

Eine Möglichkeit, dies zu überschreiben, besteht darin, den Namen des Felds in Ihrer Klasse zu ändern (wie Sie festgestellt haben). Was Sie dann auch tun können, ist das Attribut [BsonElement] zu verwenden, um Ihren C#-Feldnamen (z. B. „idd“) dem Namen zuzuordnen, der tatsächlich in der Datenbank verwendet wird (z. B. „id“). Zum Beispiel:

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

Eine andere Alternative besteht darin, die Konvention zu überschreiben, die den „Id“-Member einer Klasse findet, um das Standardverhalten des C#-Treibers für Ihre Ergebnisklasse zu unterdrücken. Sie können dies tun, indem Sie ein neues ConventionProfile für Ihre Ergebnisklasse registrieren. Zum Beispiel:

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

Sie müssen dies sehr früh in Ihrem Programm tun, bevor Ihre Ergebnisklasse zugeordnet wird.