簡體   English   中英

更新實體框架多對一關系

[英]Updating Entity Framework many-to-one Relationship

我正在嘗試使用EntityFramework更新一對多關系,但是EF由於某種原因不會保存該關系。 我正在使用ASP.Net MVC,但是在這種情況下,這似乎無關緊要,因為可以正確接收數據。

我已經嘗試了很多可能的解決方案和一些教程,但不幸的是,幾乎所有這些教程都描述了通過類本身中的外鍵屬性進行連接的情況。(我知道EF在數據庫中添加了FK,但我無法直接訪問它。)我的方法似乎有很大不同,因為他們的解決方案似乎都不適合我。

在我看來,以下代碼是最有前途的,但仍然無法正常工作。 活動對象的外鍵不會更新。

刪除context.Entry(act.ActivityGroup).State = EntityState.Detached; 導致主鍵沖突,因為EF嘗試將ActivityGroup作為新實體插入。 將其標記為Modified ,也不會成功。

楷模:

public class Activity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key]
    public Guid ActivityID { get; set; }
    public string Name { get; set; }
    public ActivityGroup ActivityGroup { get; set; }
}


public class ActivityGroup
{
    public int ActivityGroupID { get; set; }
    public string GroupName { get; set; }
    public string BackgroundColor { get; set; }
}

保存數據的方法

public ActionResult SaveActivities(List<Activity> activities)
{
    if (ModelState.IsValid)
    {
        using (TSSDBContext context = new TSSDBContext())
        {
            foreach (Activity act in activities)
            {
                if (act.ActivityGroup != null)
                {
                      context.Entry(act.ActivityGroup).State = EntityState.Detached;
                }
                context.Entry(act).State = (act.ActivityID == null || act.ActivityID == Guid.Empty) ? EntityState.Added : EntityState.Modified;
            }
            context.SaveChanges();
            return new HttpStatusCodeResult(200);
        }
    }else
    {
        return new HttpStatusCodeResult(500);
    }

}

您可以嘗試這樣的事情。

EF上下文跟蹤每一個entity ,你不需要手動標記實體,修改或添加每個。 了解有關Entityframework上下文跟蹤的信息

只需獲取您需要的實體並根據您的條件決定插入或更新,然后Add應添加和update
只需執行SaveChanges EF即可顯示魔術

這是一次插入和更新實體的基本思想。 如果您對性能有AddRange建議您使用EF 6.0中的AddRange方法進行更新

  using(var db1 = new Entities1())
  {
      var activitylists = db.Activity.ToList();

      foreach (var item in activitylists )
      {
          if(item.Id==null)
          {
              var newActivity= new Activity();
             //Your entities 
             newActivity.Name="Name";
             db.Activity.Add(newActivity);
             db.Entry<Activity>(item).State = System.Data.Entity.EntityState.Added;
          }
          else
          {
            item.Name="new name update";
           db.Entry<Activity>(item).State = System.Data.Entity.EntityState.Modified;
          }

       }
       db.SaveChanges();
   }

更新:如果從PostRequest獲取數據,則需要手動將實體標記為已modified or added因為上下文不知道如何處理實體

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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