无法使用MongoDBRef枚举对象

时间:2010-12-09 04:53:37

标签: mongodb enumeration mongodb-.net-driver dbref

我有一个名为Products的集合,我试图使用官方的mongo-csharp驱动程序枚举。但是,只要我尝试枚举集合(例如使用foreach循环),我就会收到以下错误。

“找不到MongoDB.Driver.MongoDBRef类型的默认构造函数”

实体类看起来像这样

public partial class Product
{
    public BsonObjectId _id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Url { get; set; }
    public int Price { get; set; }
    public string Country { get; set; }
    public MongoDBRef Merchant { get; set; }
}

集合中的条目如下所示

{
    "_id" : ObjectId("4cff739fba63c20301ee5bc5"),
    "Name" : "Product Name",
    "Description" : "Product Description",
    "Url" : "http://mysite/products/product-name",
    "Price" : 1200,
    "Country" : "au",
    "Merchant" : {
        "$ref" : "Merchant",
        "$id" : ObjectId("533981033d565e640d000000")
    }
}

我正在读这个。

var db = Db.Instance.GetDatabase();
var matches = db.GetCollection<Product>("Product").FindAll();

在执行以下任一操作之前,我不会收到错误。

var l = matches.ToList();

OR

foreach (var p in matches) {
   // Do something
}

1 个答案:

答案 0 :(得分:2)

  1. 使用mongovue连接到mongo db并检查收集和数据是否存在。
  2. 显示

    的代码

    var db = Db.Instance.GetDatabase();

  3. 应该是这样的:

    var server = MongoServer.Create("mongodb://localhost:27019");
    var db =  server.GetDatabase("database_name");
    

    而不是你的代码:

    var matches = db.GetCollection<Product>("Product").FindAll();
    

    3.我已经检查了c#的mongo驱动程序源代码,我在MongoDBRef中找到了以下内容

     // default constructor is private and only used for deserialization
        private MongoDBRef() {
        } 
    

    所以我建议你从mongo c#驱动程序团队的mongo驱动程序团队版本中忘记了默认构造函数。以任何方式使用reflector检查构造函数是否存在/不存在。 4.我99%确定构造函数不会出现在你的mongo驱动程序版本中。因为当你开始枚举一些mongo集合时,mongo驱动程序会想要数据,如果没有找到默认构造函数则抛出错误。