0

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

4

1 に答える 1

0

0.9 で説明されている内容を再現できますが、最新のコードでは正しく動作しています。

ドライバーは github の最新コードから自分でビルドするか、まもなくリリースされる 0.11 を待つことができます。

-- monodb-user Google グループの Robert Stam 氏

于 2011-01-24T21:20:49.667 に答える