MongoDBでは、データベースに保存されているすべてのドキュメントに「_id」というフィールド(ルートレベル)が必要です。
C#ドライバーは、「Id」、「id」、または「_id」と呼ばれるクラス内のすべてのフィールドが、特別な「_id」フィールドにマップされることを想定しています。これは慣例であり、オーバーライドできます。 C#ドライバーは、Resultクラスがコレクションのルートドキュメントとして使用されることを意図していないことを認識しないため、「id」フィールドを検索し、データベース内の「_id」にマップします。
これをオーバーライドできる1つの方法は、クラス内のフィールドの名前を変更することです(発見したとおり)。次に、[BsonElement]属性を使用して、C#フィールド名(「idd」など)をデータベースで実際に使用されている名前(「id」など)にマップすることもできます。例:
public class Result
{
[BsonElement("id")]
public int idd; // matches "id" in the database
// other fields
}
もう1つの方法は、クラスの「Id」メンバーを見つける規則をオーバーライドして、ResultクラスのC#ドライバーのデフォルトの動作を抑制することです。これを行うには、Resultクラスに新しいConventionProfileを登録します。例:
var noIdConventions= new ConventionProfile();
noIdConventions.SetIdMemberConvention(new NamedIdMemberConvention()); // no names
BsonClassMap.RegisterConventions(noIdConventions, t => t == typeof(Result));
Resultクラスがマップされる前に、プログラムの非常に早い段階でこれを行う必要があります。