Entity Framework 4.1 — Коллекция дочерних объектов дублируется после каждого сохранения

#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>() ).