Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C EF更新相关实体_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# C EF更新相关实体

C# C EF更新相关实体,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我正在尝试更新两个实体之间的引用。遗憾的是,我的更新方法只对简单字段有效,而对整个实体无效 在我的DbContext中,我有更新方法: public void UpdateProject(Project e) { this.projects.Attach(e); this.employees.Attach(e.ProjectLeader); //added later this.Entry<Project>(e).State = EntityState.Mod

我正在尝试更新两个实体之间的引用。遗憾的是,我的更新方法只对简单字段有效,而对整个实体无效

在我的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();
}

此关系在我的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"));
}
但是没有成功

从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;
}

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

给出了一个记录,记录了一个项目a的员工 您可以更改分离的实体,以便员工B可以创建项目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%肯定这会起作用,但希望它能给你一些想法来缩小如何重新关联实体的范围

你能添加显示如何从EF获取对象的代码吗?@RyanS我添加了这个方法。ProjectLeader将是EmployeeSworkingonProjects的员工之一您确定该问题与读取过程无关吗?您未标记为虚拟项目负责人。Hibernate在EF简单地禁用延迟加载时引发错误。@bubi ProjectLeader不仅仅是一个导航属性。我想StevePy的答案就是我想要的,即使感觉dirtyNavigation属性有不同的行为,我忘记了。你可以发现一些问题。另一个很好的解决方案可能是添加外键列,因为如果插入属性EF,效果会更好。我习惯于从Java休眠,在Java中,您可以分配一个新的引用并调用update方法。我对普通SQL做了一些修改,设置表中的引用,然后设置e.ProjectLeader=null;然后更新。不太好,但很有效,还是非常感谢你的努力
this.Entry(e).CurrentValues.SetValues(e);
this.Entry(e.ProjectLeader).CurrentValues.SetValues(e.ProjectLeader);
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;
}
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();
}