MongoDbサイトのC#ドライバを使用して、私のWebアプリケーションの永続レイヤをMongoDbに変更しました。 1つのクラスを除いて、私のテストのすべてが合格になっていることを喜んで驚いた。そのプロパティの1つは、IListを実装する型であり、何らかの理由でアイテムを保存しません。MongoDb C#ドライバ、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);
私はList<Foo>
としてFoo.Foosを宣言すると、それは動作します:
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 } }
注私はFooList : List<Foo>
を使用した場合の結果が同じであるとして、それは私のIList実装とは何の関係もないこと。
私はBSONシリアライザが混乱していると推測していますか?私はこれが役立つかもしれないと思うように私を導いた、弁別上のドキュメントを見て:
BsonClassMap.RegisterClassMap<List<Foo>>(cm => {
cm.AutoMap();
cm.SetIsRootClass(true);
});
BsonClassMap.RegisterClassMap<FooList>();
私はまだ私のアイテムがが保存されません、このように見える終わる:どのように
{ "_id" : "root", "Foos" : { "_t" : [ "List`1", "FooList" ], "Capacity" : 4 } }
FooList
を正しく保存できますか?
のロバート・スタムは、あなたはどの 'BsonKnownType'属性を追加しようとしたことがありますか? –
こんにちは。私が間違っていない限り、上記のRegisterClassMapコードはBsonKnownType属性を使用するのと同じです:http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorialScalarandHierarchicaldiscriminators – nrkn
この問題に興味があるなら、私たちはmongodb-user Google Groupでそれを掘り下げています...まだ幸運ではありません。 http://groups.google.com/group/mongodb-user/browse_thread/thread/4924584946d3b7d1 – nrkn