2010-12-09 55 views
2

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

“默认构造函数找不到类型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 
} 
+0

我知道你把实体类,但禁止你提供一个示例文件或两个在你的问题?这可能有助于重现这一点。 – 2010-12-13 07:48:46

+0

我刚刚更新了问题欢呼贾斯汀。 – Alex 2010-12-13 13:53:05

回答

2
  1. 连接到蒙戈DB使用mongovue并检查收集和数据存在。
  2. 显示代码

    var db = Db.Instance.GetDatabase();

应该是这样的:

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

,比你要跟代码:

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

3.I've检查蒙戈驱动源的C#,我发现以下在MongoDBRef中

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

所以我建议,在你的mongo驱动程序的家伙从mongo c#驱动程序团队的版本忘了默认的构造函数。以任何方式检查,请构造函数存在/不存在使用reflector。 4.我99%确定构造函数不在你的mongo驱动版本上。因为当你开始枚举一些mongo集合的mongo驱动程序去实现数据的渴望,并在万一如果默认构造函数没有找到错误。