【问题标题】:MongoDb C# driver, property of type implementing IList not savingMongoDb C# 驱动程序,实现 IList 的类型的属性不保存
【发布时间】:2011-01-24 05:05:34
【问题描述】:

使用来自 MongoDb 站点的 C# 驱动程序将我的 Web 应用程序的持久层更改为 MongoDb。惊喜地发现我所有的测试都通过了……除了一门课。它的一个属性是实现 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&lt;Foo&gt;,它会起作用:

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&lt;Foo&gt;,结果是相同的。

我假设 BSON 序列化程序很困惑?我查看了有关鉴别器的文档,这让我认为这可能会有所帮助:

BsonClassMap.RegisterClassMap<List<Foo>>( cm => {
  cm.AutoMap();
  cm.SetIsRootClass( true );
} );
BsonClassMap.RegisterClassMap<FooList>();    

我仍然没有保存我的项目,最终看起来像这样:

{ "_id" : "root", "Foos" : { "_t" : [ "List`1", "FooList" ], "Capacity" : 4 } }

如何正确保存FooList?

【问题讨论】:

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

我能够重现你的样子 用 0.9 描述,但它正在工作 正确使用最新的代码。

您可以自己构建驱动程序 来自 github 中的最新代码,或 等待即将到来的 0.11 很快。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 2014-03-16
    相关资源
    最近更新 更多