Сохранить объект с двунаправленной связью в 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