2011-01-24 13 views
0

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を正しく保存できますか?

+0

のロバート・スタムは、あなたはどの 'BsonKnownType'属性を追加しようとしたことがありますか? –

+0

こんにちは。私が間違っていない限り、上記のRegisterClassMapコードはBsonKnownType属性を使用するのと同じです:http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial#CSharpDriverSerializationTutorialScalarandHierarchicaldiscriminators – nrkn

+0

この問題に興味があるなら、私たちはmongodb-user Google Groupでそれを掘り下げています...まだ幸運ではありません。 http://groups.google.com/group/mongodb-user/browse_thread/thread/4924584946d3b7d1 – nrkn

答えて

0

私はあなたが0.9で 記述しているが、それは最新のコードで正しく に取り組んでいるものを再現することができています。

githubの最新コードから自分でドライバを構築することができます。 は、すぐに到着する0.11を待つことになります。

- monodb-user Google Group