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

Mærkelig opførsel af MongoDB LINQ-udbyder for felter kaldet id

MongoDB kræver, at hvert dokument, der er gemt i databasen, har et felt (på rodniveau) kaldet "_id".

C#-driveren antager, at ethvert felt i din klasse kaldet "Id", "id" eller "_id" er beregnet til at blive afbildet til det specielle "_id"-felt. Dette er en konvention, som kan tilsidesættes. C#-driveren ved ikke, at din Result-klasse ikke er beregnet til at blive brugt som roddokument for en samling, så den finder dit "id"-felt og knytter det til "_id" i databasen.

En måde du kan tilsidesætte dette på er at ændre navnet på feltet i din klasse (som du opdagede). Hvad du så også kan gøre, er at bruge [BsonElement]-attributten til at kortlægge dit C#-feltnavn (f.eks. "idd") til det navn, der rent faktisk bliver brugt i databasen (f.eks. "id"). For eksempel:

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

Et andet alternativ er at tilsidesætte konventionen, der finder "Id"-medlemmet af en klasse for at undertrykke standardadfærden for C#-driveren for din resultatklasse. Du kan gøre dette ved at registrere en ny ConventionProfil for din resultatklasse. For eksempel:

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

Du skal være sikker på at gøre dette meget tidligt i dit program, før din resultatklasse bliver kortlagt.



  1. Hvordan gemmer jeg en fil i MongoDB?

  2. Hvordan gemmer man dato korrekt?

  3. Tilknytning af MongoDB-dokumenter til sagsklasse med typer, men uden indlejrede dokumenter

  4. Hvordan kan jeg løse MongoWaitQueueFullException?