Singkat cerita:ini semua tentang konvensi. Driver MongoDB .NET mengekspos kelas statis ConventionRegistry yang memungkinkan Anda untuk mendaftarkan konvensi Anda sendiri (lebih banyak di sini
). Selain itu ada dua konvensi "bawaan" __defaults__ dan __attributes__ . Menggali lebih dalam (driver github
) Anda dapat menemukan bahwa ia mendaftarkan satu konvensi yang cukup menarik:
new NamedIdMemberConvention(new [] { "Id", "id", "_id" })
Artinya id anggota akan dianggap sebagai elemen _id BSON biasa.
Bagaimana cara memperbaikinya?
Anda dapat menyingkirkan konvensi default
ConventionRegistry.Remove("__defaults__");
Namun secara otomatis Anda akan membatalkan semua konvensi driver lain yang cukup berisiko. Atau Anda dapat membuat properti palsu yang akan selalu kosong:
public class SubServiceDef
{
[BsonElement("id")]
public int Id { get; set; }
[BsonId]
public ObjectId FakeId { get; set; }
}
atau Anda bisa menggunakan BsonNoId atribut yang
[BsonNoId]
public class SubServiceDef
{
[BsonElement("id")]
public int Id { get; set; }
}
Jadi konvensi akan mengatur id Anda sebagai IdMember di peta kelas tetapi kemudian selama pascapemrosesan atribut ini akan memaksa IdMember menjadi nol dan kelas Anda akan berhasil dideserialisasi