EF代码首先更新实体及其子代

时间:2014-12-30 16:04:25

标签: c# entity-framework

我有更新方法,只更新没有子节点的实体

    public void Update(T obj)
    {
        Ensure.IsNull(obj);

        using (var DB = AccessManager.db)
        {
            DB.Set<T>().Attach(obj);
            DB.Entry(obj).State = System.Data.EntityState.Modified;
            DB.SaveChanges();
        }
    }

我尝试更新

LessonModel.Title = "Updated";
LessonModel.Files.Add(new LessonFileModel { IdxNumber = LessonModel.IdxNumber, FileName = "asd", FilePath = " asdf" });
DALFacade.Lesson.Update(LessonModel);

只有标题会更新。文件未更新。

所以如果这样的方法:

    public void Update(LessonModel obj)
    {
        Ensure.IsNull(obj);

        using (var DB = AccessManager.db)
        {
            DB.Lessons.Attach(obj);
            DB.Entry(obj).State = System.Data.EntityState.Modified;
            DB.SaveChanges();
        }
    }

我该如何拯救孩子?

1 个答案:

答案 0 :(得分:3)

这是使用"Generic Repository" anti pattern时出现的问题之一。编写一个适用于您传入的实体图形的每个组合的Update方法,并且它将始终完全按照您的意愿执行,这是EF 中的一个很大的痛苦。

相反,请尝试编写与您的用例匹配的存储库。

如果您在中将文件添加到上下文后将文件添加到课程,则可以解决当前问题。将条目标记为已修改会将此条目上的所有属性标记为已修改,但不会影响关系。