Изменен уровень персистентности моего веб-приложения на MongoDb с использованием драйверов C # с сайта MongoDb. Был приятно удивлен, когда все мои тесты прошли успешно ... за исключением одного занятия. Одним из его свойств является тип, который реализует IList и по какой-то причине не сохраняет свои элементы.
Я построил минимальный тестовый пример для иллюстрации. Вот тестовый код для создания и сохранения родительского объекта:
var fooCollection = database.GetCollection<Foo>( typeof( Foo ).Name );
var foo = new Foo {Id = "Root"};
foo.Foos.Add( new Foo{ Id = "Child" } );
fooCollection.Save( foo );
Если я объявляю Foo.Foos как List<Foo>
, это работает:
public class Foo {
public Foo() {
Foos = new List<Foo>();
}
public List<Foo> Foos;
public string Id;
}
(правильный) результат:
{ "_id" : "root", "Foos" : [ { "Foos" : [], "_id" : "child" } ] }
Однако мне нужно вот что:
public class Foo {
public Foo() {
Foos = new FooList();
}
public FooList Foos;
public string Id;
}
public class FooList : IList<Foo> {
//IList implementation omitted for brevity
}
(Неверный) результат:
{ "_id" : "root", "Foos" : { "Capacity" : 4 } }
Обратите внимание, что это не имеет ничего общего с моей реализацией IList, поскольку результаты будут такими же, если я использую FooList : List<Foo>
.
Я предполагаю, что сериализатор BSON запутался? Я посмотрел документацию по дискриминаторам, из-за чего я подумал, что это может помочь:
BsonClassMap.RegisterClassMap<List<Foo>>( cm => {
cm.AutoMap();
cm.SetIsRootClass( true );
} );
BsonClassMap.RegisterClassMap<FooList>();
Я все еще не сохраняю свои вещи, в конечном итоге выглядит так:
{ "_id" : "root", "Foos" : { "_t" : [ "List`1", "FooList" ], "Capacity" : 4 } }
Как правильно сохранить FooList
?