EntityFramework更新实体及相关对象

时间:2015-01-13 14:34:59

标签: c# entity-framework

我有一个Project实体和一个Rule实体。一个项目可以有很多规则。

编辑1:以下是我们定义的关系。很抱歉没有在导航属性中使用复数,我们还没有更新它。

enter image description here

所以我有这个方法:

    public bool Update(Project project)
    {
        Logger.Log(GetType(), string.Format("Updating project {0}", project));
        using (var ctx = new EntityModelContainer())
        {

            if (project.Id == 0)
            {
                return false;
            }

            try
            {
                ctx.ProjectSet.Attach(project);
                ctx.Entry(project).State = EntityState.Modified;
                return ctx.SaveChanges() >= 1;
            }
            catch (Exception exc)
            {
                throw new ComplianceException(exc.Message, exc);
            }
        }
    }

它将更新项目的所有标量属性。但是,如果我向项目添加或删除规则并运行Update(project),则不予考虑。为什么呢?

编辑2:我还尝试重新阅读项目并分配更新的值。请注意projectRead.Rule是一个列表。

    public bool Update(Project projectGiven)
    {
        // Add all changes here
        Project projectRead = this.ReadProject(projectGiven.Id);
        if (projectRead == null)
        {
            Logger.Log(GetType(), "Project not found");
            return false;
        }

        projectRead.ProjectName = projectRead.ProjectName;
        projectRead.Report = projectRead.Report;
        projectRead.Rule = projectRead.Rule;

        Logger.Log(GetType(), string.Format("Updating project {0}", projectRead));
        using (var ctx = new EntityModelContainer())
        {
            ...

非常感谢!

2 个答案:

答案 0 :(得分:0)

在我看来,使用最新版本的实体框架,如果已将实体分配给已更改跟踪器中的实体,则实体不会自动添加到更改跟踪器。

显然,这取决于角色和项目的相关方式。

我想更简单的方法是创建一个重新加载项目的过程,包括所有角色,从列表中删除选定的一个,然后保存它,此时我认为更新是相对完成的。< / p>

答案 1 :(得分:0)

我解决了这个问题。我需要在更新之前在相同的上下文中重新加载项目。