Сохранить объект с двунаправленной связью в mongodb, используя официальный драйвер C#

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

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 ответа

Решение

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

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

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

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

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

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

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

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

https://github.com/impetus-opensource/Kundera взгляните на примеры кундеры по адресу git@github.com:impetus-opensource/Kundera-examples.git

Другие вопросы по тегам