Ответ 1
Если вы не используете один и тот же экземпляр контекста для загрузки связанных объектов, вы не можете просто добавить их в новый объект и ожидать, что существующие записи в базе данных будут использоваться. Новый контекст не знает, что эти экземпляры существуют в базе данных - вы должны сказать это в контексте.
Решения:
- Использовать тот же контекст как для связанных с загрузкой объектов, так и для сохранения нового объекта
- Не загружать связанные объекты и использовать фиктивные объекты
- Загружает объекты из первого контекста и отделяет их, присоединяет объекты к новому контексту и после этого назначает их новому объекту.
- После добавления нового объекта с отношениями вручную измените состояние отношений от
Added
доUnchanged
Пример для 1:
var module = context.Modules.SingleOrDefault(m => m.ID == 1);
var taskType = context.TaskTypes.SingleOrDefault(t => t.ID == 1);
Task task = new Task();
task.Module = module;
task.Type = taskType;
context.Tasks.Add(task);
Пример для 2:
var module = new Module { Id = 1 };
var taskType = new TaskType { Id = 1 };
context.Modules.Attach(module);
context.TaskTypes.Attach(taskType);
Task task = new Task();
task.Module = module;
task.Type = taskType;
context.Tasks.Add(task);
Пример для 3:
var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1);
otherContext.Entry(module).State = EntityState.Detached;
var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1);
otherContext.Entry(taskType).State = EntityState.Detached;
context.Modules.Attach(module);
context.TaskTypes.Attach(taskType);
Task task = new Task();
task.Module = module;
task.Type = taskType;
context.Tasks.Add(task);
Пример для 4:
var module = otherContext.Modules.SingleOrDefault(m => m.ID == 1);
otherContext.Entry(module).State = EntityState.Detached;
var taskType = otherContext.TaskTypes.SingleOrDefault(t => t.ID == 1);
otherContext.Entry(taskType).State = EntityState.Detached;
Task task = new Task();
task.Module = module;
task.Type = taskType;
context.Tasks.Add(task);
context.Entry(module).State = EntityState.Unchanged;
context.Entry(taskType).State = EntityState.Unchanged;