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.