sql >> Database >  >> NoSQL >> MongoDB

Vreemd gedrag van MongoDB LINQ-provider voor velden met de naam id

MongoDB vereist dat elk document dat in de database is opgeslagen een veld (op rootniveau) heeft met de naam "_id".

Het C#-stuurprogramma gaat ervan uit dat elk veld in uw klasse met de naam "Id", "id" of "_id" moet worden toegewezen aan het speciale veld "_id". Dit is een conventie, een die kan worden overschreven. Het C#-stuurprogramma weet niet dat uw Result-klasse niet bedoeld is om te worden gebruikt als het hoofddocument van een verzameling, dus vindt het uw "id"-veld en wijst het toe aan "_id" in de database.

Een manier om dit te overschrijven is door de naam van het veld in je klas te veranderen (zoals je hebt ontdekt). Wat u dan ook kunt doen, is het kenmerk [BsonElement] gebruiken om uw C#-veldnaam (bijv. "idd") toe te wijzen aan de naam die daadwerkelijk in de database wordt gebruikt (bijv. "id"). Bijvoorbeeld:

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

Een ander alternatief is het negeren van de conventie die het "Id"-lid van een klasse vindt om het standaardgedrag van het C#-stuurprogramma voor uw resultaatklasse te onderdrukken. U kunt dit doen door een nieuw ConventionProfile te registreren voor uw Result-les. Bijvoorbeeld:

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

Je moet er zeker van zijn dat je dit heel vroeg in je programma doet, voordat je resultaatklasse in kaart wordt gebracht.



  1. Hoe null-waarden te behouden aan het einde van het sorteren in Mongoose?

  2. Secundair naar primair promoveren van secundair knooppunt

  3. MongoDB samengestelde index gebruik

  4. pymongo.errors.CursorNotFound:cursor id '...' niet geldig op server