#entity-framework #entity-framework-4 #ef-code-first
#entity-framework #entity-framework-4 #ef-code-first
Вопрос:
У меня проблема с Entity Framework (EF4.1 — CodeFirst)
Это в основном дублирование дочерних объектов…
Объектная модель представляет собой ряд задач внутри задания -> Задача имеет TaskType, и этот TaskType имеет несколько статусов …
Сначала это было дублирование типов задач при сохранении
Однако после того, как я добавил это, оно перестало дублировать типы задач…
context.Entry(task.TaskType).State = EntityState.Unchanged;
Итак, я попробовал это для статусов…
//tried this but it errors
foreach (var status in task.TaskType.Statuses)
{
context.Entry(status).State = EntityState.Unchanged;
}
////
Но это приводит к следующим ошибкам…
«Оператор обновления, вставки или удаления хранилища повлиял на неожиданное количество строк (0). Объекты могли быть изменены или удалены с момента загрузки объектов. Обновите записи ObjectStateManager «.
Вот код полностью… (часть кода get урезана для удобства чтения)
using(var context = new JobContext())
{
var job = //Get with Includes;
job.Tasks.Add(task);
context.Jobs.Attach(job);
context.Entry(task.TaskType).State = EntityState.Unchanged;
//tried this but it errors
foreach (var status in task.TaskType.Statuses)
{
context.Entry(status).State = EntityState.Unchanged;
}
////
context.SaveChanges();
}
Кто-нибудь может помочь, пожалуйста?
Ответ №1:
using(var context = new JobContext())
{
var job = //Get with Includes;
context.Jobs.Attach(job);
// can be omitted if "Get with Includes" happens in the same context
context.TaskTypes.Attach(task.TaskType);
// attaches TaskType and all Statuses -> State is Unchanged
job.Tasks.Add(task);
// A new task will be created after SaveChanges. If you don't want that
// replace Attach(task.TaskType) above by Attach(task)
context.SaveChanges();
}
Для этого вам не нужно загружать с Include
помощью by the way . Вы можете загрузить без Include
(а затем создать пустую коллекцию job.Tasks = new List<Task>()
).