сохранить объект с двунаправленной связью в mongodb, используя официальный драйвер c # - PullRequest
7 голосов
/ 11 декабря 2011

У меня есть два класса, как это:

public Class Company
{
    public IList<Employee> Employees;
}

public Class Employee
{
    public Company WorkPlace;
}

когда я хочу сохранить объект класса Company:

MongoDatabase Database = MongoServer.GetDatabase("db");

var workPlace = new Company();

var employee = new Employee { WorkPalce = workPlace}    
workPlace.Employees = new List<Employee>{ employee };

Database.GetCollection<Company>("company").Save(workPlace);

Исключение StackOverFlow будет выдано.

Ответы [ 3 ]

7 голосов
/ 11 декабря 2011

Это вызвано тем, что у вас есть цикл, сформированный классами, ссылающимися друг на друга, очевидно, что драйвер не способен справиться с этим, и я не уверен, что это нужно.

Вам нужно решить, как вы хотитеэти данные смоделированы в базе данных.
Если у вас есть две коллекции, одна из компаний и одна из сотрудников, то на уровне данных вы должны просто включать идентификаторы для ссылок.

Если вы простотем не менее, имея одну коллекцию компаний, вам просто нужно изменить класс сотрудника, чтобы он ссылался на компанию с идентификатором вместо ссылки на объект.

Это должно происходить только в базе данных, однако вы можете расширить свою модель в своем коде на c #, чтобы автоматически добавлять ссылку на объект или лениво загружать ее и т. Д. (Избегая выбора проблем N + 1, как вы делаете), в зависимости от того, чтоподходит для ситуации.

0 голосов
/ 13 декабря 2011

Предлагаю попробовать кундера.Он должен быть в состоянии обработать такой случай для Монго.

https://github.com/impetus-opensource/Kundera взгляните на kundera-examples на git@github.com: impetus-opensource / Kundera-examples.git

0 голосов
/ 12 декабря 2011

Этот вопрос также задавался в группах Google:

https://groups.google.com/group/mongodb-user/browse_thread/thread/4ea7c6885bfb4f33#

и там есть несколько дополнительных ответов.

...