簡體   English   中英

C#EF更新相關實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM