C#EF更新相关实体

时间:2018-05-14 22:26:13

标签: c# entity-framework entity-framework-6

我正在尝试更新2个实体之间的引用。遗憾的是,我的更新方法仅适用于简单字段,但不适用于整个实体。

在我的DbContext我有更新方法:

public void UpdateProject(Project e)
{
    this.projects.Attach(e);
    this.employees.Attach(e.ProjectLeader); //added later
    this.Entry<Project>(e).State = EntityState.Modified;
    this.Entry<Employee>(e.ProjectLeader).State = EntityState.Modified; //added later
    this.SaveChanges();
}

我之后添加的内容因为整个网络中的不同建议而被添加。

我有以下(简化)课程:

public class Employee
{
    [DataMember]
    public int? ID { get; set; }

    [DataMember]
    public String Name { get; set; }

    [DataMember]
    public virtual Project LeaderOfProject { get; set; }
}

public class Project
{
    [DataMember]
    public int? ID { get; set; }

    [DataMember]
    public String Titel { get; set; }

    [DataMember]
    public Employee ProjectLeader { get; set; }
}

此关系在我的OnModelCreate方法中定义如下:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

    modelBuilder.Entity<Employee>()
                .HasOptional<Project>(e => e.LeaderOfProject)
                .WithOptionalPrincipal(p => p.ProjectLeader)
                .Map(m => m.MapKey("ProjectLeader"));
}

使用上面显示的更新方法,我可以更新Titel字段,但我无法将任何Employee指定为新ProjectLeader(没有错误,但没有更新以及)。

更改/更改相关实体需要更改哪些内容?

非常感谢任何帮助。

我也试过

this.Entry(e).CurrentValues.SetValues(e);
this.Entry(e.ProjectLeader).CurrentValues.SetValues(e.ProjectLeader);

但没有成功。

从EF检索对象的方法:

public Project FindProjectById(int id)
{
    Project Result = this.projects
        .Include(x => x.ProjectLeader)
        .Include(x => x.EmployeesWorkingOnProject)
        .Include(x => x.ProjectSteps)
        .SingleOrDefault(x => x.ID == id);
    return Result;
}

1 个答案:

答案 0 :(得分:1)

我不相信你可以通过将修改后的实体附加到上下文而不是加载原始实体,取消它们之间的引用,然后关联新引用来实现这一点。

鉴于记录中有员工A&lt; - &gt;项目A. 您更改分离的实体,以便员工B&lt; - &gt;项目A.

项目A的员工可能指向B,但根据上下文,员工A仍然指向项目A.员工是校长。

双向引用几乎总是很痛苦。 :)

您可能需要做的事情如下:

public void UpdateProject(Project e)
{
    var project = this.projects.Find(e.ProjectId);
    project.ProjectLeader.LeaderOfProject = null; // De-associate Employee A's project.
    //Copy values from e to project.
    project.StartDate = e.StartDate; // May be able to use CopyValues against Entity(project)... Would need to test. :)

    var employee = this.employees.Attach(e.ProjectLeader); // Attach employee B to this context.
    project.ProjectLeader = employee; // Associate Employee B to project, and project to employee B.
    employee.LeaderOfProject = project;
    this.SaveChanges();
}
警告:我并非100%确定这会有效,但希望它能为您提供一些想法,以缩小如何重新关联实体。