2010-12-09 56 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驅動程序去實現數據的渴望,並在萬一如果默認構造函數沒有找到錯誤。