实体框架4.1 - 每次保存后,子对象集合都会重复

时间:2011-10-27 16:59:02

标签: entity-framework entity-framework-4 ef-code-first

我遇到了实体框架(EF4.1 - CodeFirst)的问题

它基本上是复制子对象......

对象模型是作业中的许多任务 - >任务有一个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 个答案:

答案 0 :(得分: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。您可以在没有Include的情况下加载(然后创建一个空集合job.Tasks = new List<Task>())。