使用 MongoDb 站点中的 C# 驱动程序将我的 Web 应用程序的持久层更改为 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
正确保存?