C# C EF更新相关实体
我正在尝试更新两个实体之间的引用。遗憾的是,我的更新方法只对简单字段有效,而对整个实体无效 在我的DbContext中,我有更新方法: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
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();
}