2011-01-24 68 views
0

使用MongoDb站點的C#驅動程序將我的Web應用程序的持久層更改爲MongoDb。驚喜地發現我的所有考試都通過了...除了一門課。它的一個屬性是實現IList的類型,由於某種原因它不保存它的項目。MongoDb C#驅動程序,實現IList類型的屬性不保存

我已經構建了一個最小的測試用例來說明。下面是測試代碼來創建和保存父對象:如果我宣佈Foo.Foos爲List<Foo>它的工作原理

var fooCollection = database.GetCollection<Foo>(typeof(Foo).Name); 
var foo = new Foo {Id = "Root"}; 
foo.Foos.Add(new Foo{ Id = "Child" }); 
fooCollection.Save(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嗎?

+0

你試過添加任何'BsonKnownType`屬性? – 2011-01-24 05:31:17

回答

0

我能夠重現你是什麼 0.9描述,但它與最新的代碼正常工作 。

您可以自己建立驅動程序 從github最新的代碼,或 等待0.11這很快就會到來 。

- 羅伯特·斯塔姆,在monodb-user Google Group

相關問題