MongoDb サイトの C# ドライバーを使用して、Web アプリの永続化レイヤーを MongoDb に変更しました。1 つのクラスを除いて、すべてのテストに合格したことに驚きました。そのプロパティの 1 つは 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
正しく保存できますか?