Entity Framework 4.1 - коллекция дочерних объектов дублируется после каждого сохранения - PullRequest
0 голосов
/ 27 октября 2011

У меня проблема с Entity Framework (EF4.1 - CodeFirst)

Это в основном дублирование дочерних объектов ...

Объектная модель представляет собой несколько задач в пределахJob -> Задача имеет TaskType, и этот TaskType имеет несколько Состояний ...

Сначала он дублировал TaskTypes при сохранении

Однако после того, как я добавил это, он перестал дублироватьTaskTypes ...

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. "

Здесь код полностью ... (с некоторымикода получения, обрезанного для удобства чтения)

    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 Ответ

1 голос
/ 27 октября 2011
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. Вы можете загрузить без Include (а затем создать пустую коллекцию job.Tasks = new List<Task>()).

...