sql >> Databáze >  >> NoSQL >> MongoDB

Podivné chování poskytovatele MongoDB LINQ pro pole s názvem id

MongoDB vyžaduje, aby každý dokument uložený v databázi měl pole (na kořenové úrovni) nazvané „_id“.

Ovladač C# předpokládá, že jakékoli pole ve vaší třídě nazvané "Id", "id" nebo "_id" má být namapováno na speciální pole "_id". Toto je konvence, kterou lze přepsat. Ovladač C# neví, že vaše třída Result není určena k použití jako kořenový dokument kolekce, takže najde vaše pole „id“ a namapuje ho na „_id“ v databázi.

Jedním ze způsobů, jak to můžete přepsat, je změnit název pole ve vaší třídě (jak jste zjistili). Co pak můžete také udělat, je použít atribut [BsonElement] k namapování názvu vašeho pole C# (např. „idd“) na jakýkoli název, který se skutečně používá v databázi (např. „id“). Například:

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

Další alternativou je přepsat konvenci, která najde člena třídy "Id", aby se potlačilo výchozí chování ovladače C# pro třídu Result. Můžete to udělat registrací nového ConventionProfile pro třídu Result. Například:

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

Musíte si být jisti, že to uděláte velmi brzy ve svém programu, než bude vaše třída výsledků zmapována.



  1. Nástroj pro vytvoření vizualizace z existující MongoDB

  2. Laravel Socket.io Připojeno, ale nepřijímá data

  3. Získání chyby v problému přetypování mongodb pro platné ID objektu

  4. nelze rozdělit':špatný URI (není URI?):