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