[英]C# EF update related entities
我正在嘗試更新2個實體之間的引用。 遺憾的是,我的更新方法僅適用於簡單字段,而不適用於整個實體。
在我的DbContext
我有update方法:
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;
}
我不相信您可以通過將修改后的實體附加到上下文中,而不是加載原始實體,取消它們之間的引用,然后關聯新的引用,來做到這一點。
給定具有員工A <->項目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%肯定會行得通,但希望它能為您提供一些想法,以縮小如何重新關聯實體的范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.