2010-12-09 2 views
2

У меня есть коллекция под названием Продукты, которые я пытаюсь перечислить, используя официальный драйвер 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(); 

ИЛИ

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

Я знаю, что вы поместили класс сущности, но запретите вам предоставить примерный документ или два в вашем вопросе? Это может помочь в воссоздании этого. – 2010-12-13 07:48:46

+0

Я только что обновил вопрос, приветствую Джастина. – Alex 2010-12-13 13:53:05

ответ

2
  1. Подключение к Монго дБ с помощью mongovue и проверить, что сбор и данных существует.
  2. Показать код

    вар дб = Db.Instance.GetDatabase();

Должно быть что-то вроде этого:

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

и чем Yous код:

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, собирающиеся запрашивать данные, и в случае, если конструктор по умолчанию не найден, генерирует ошибку.