MongoDB wymaga, aby każdy dokument przechowywany w bazie danych miał pole (na poziomie głównym) o nazwie „_id”.
Sterownik C# zakłada, że dowolne pole w klasie o nazwie „Id”, „id” lub „_id” ma być mapowane na specjalne pole „_id”. To jest konwencja, którą można przełamać. Sterownik C# nie wie, że klasa Result nie ma być używana jako dokument główny kolekcji, więc znajduje pole „id” i mapuje je na „_id” w bazie danych.
Jednym ze sposobów, w jaki możesz to obejść, jest zmiana nazwy pola w twojej klasie (jak odkryłeś). Następnie możesz również użyć atrybutu [BsonElement], aby zmapować nazwę pola C# (np. „idd”) na dowolną nazwę faktycznie używaną w bazie danych (np. „id”). Na przykład:
public class Result
{
[BsonElement("id")]
public int idd; // matches "id" in the database
// other fields
}
Inną alternatywą jest zastąpienie konwencji, która znajduje element członkowski "Id" klasy, aby pominąć domyślne zachowanie sterownika C# dla klasy Result. Możesz to zrobić, rejestrując nowy ConventionProfile dla klasy wyników. Na przykład:
var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));
Musisz to zrobić na bardzo wczesnym etapie programu, zanim klasa wyników zostanie zmapowana.