Masalahnya adalah driver baru membuat kamus bersambung sebagai dokumen secara default.
Driver MongoDB C# memiliki 3 cara untuk membuat kamus bersambung:Document
, ArrayOfArrays
&ArrayOfDocuments
(lebih lanjut tentang itu di dokumen). Ketika bersambung sebagai dokumen, kunci kamus adalah nama elemen BSON yang memiliki beberapa batasan (misalnya, seperti yang disarankan kesalahan, mereka harus diserialisasi sebagai string).
Dalam hal ini, kunci kamus adalah DateTime
s yang tidak diserialisasi sebagai string, tetapi sebagai Date
jadi kita perlu memilih DictionaryRepresentation
yang lain .
Untuk mengubah serialisasi properti khusus ini, kita dapat menggunakan BsonDictionaryOptions
atribut dengan DictionaryRepresentation
yang berbeda :
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<DateTime, int> Dictionary { get; private set; }
Namun, kita perlu melakukan itu pada setiap anggota yang bermasalah secara individual. Untuk menerapkan DictionaryRepresentation
ini untuk semua anggota yang relevan, kami dapat menerapkan konvensi baru:
class DictionaryRepresentationConvention : ConventionBase, IMemberMapConvention
{
private readonly DictionaryRepresentation _dictionaryRepresentation;
public DictionaryRepresentationConvention(DictionaryRepresentation dictionaryRepresentation)
{
_dictionaryRepresentation = dictionaryRepresentation;
}
public void Apply(BsonMemberMap memberMap)
{
memberMap.SetSerializer(ConfigureSerializer(memberMap.GetSerializer()));
}
private IBsonSerializer ConfigureSerializer(IBsonSerializer serializer)
{
var dictionaryRepresentationConfigurable = serializer as IDictionaryRepresentationConfigurable;
if (dictionaryRepresentationConfigurable != null)
{
serializer = dictionaryRepresentationConfigurable.WithDictionaryRepresentation(_dictionaryRepresentation);
}
var childSerializerConfigurable = serializer as IChildSerializerConfigurable;
return childSerializerConfigurable == null
? serializer
: childSerializerConfigurable.WithChildSerializer(ConfigureSerializer(childSerializerConfigurable.ChildSerializer));
}
}
Yang kami daftarkan sebagai berikut:
ConventionRegistry.Register(
"DictionaryRepresentationConvention",
new ConventionPack {new DictionaryRepresentationConvention(DictionaryRepresentation.ArrayOfArrays)},
_ => true);