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