我尝试更新与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);
}
}
答案 0 :(得分:1)
你可以尝试这样的事情。
EF上下文跟踪您不需要手动标记的每个
entity
实体,为每个实体修改或添加。 Read about Entityframework context tracking
只需获取您需要的实体,然后根据您的情况决定插入或更新实体,并Add
应添加的内容和update
只需做一个SaveChanges
EF将展示神奇的
这是一次性插入和更新实体的基本思路。如果您对性能有疑虑,建议您使用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
,因为上下文不知道如何处理实体