更新实体框架多对一关系

时间:2016-05-31 13:27:26

标签: c# entity-framework

我尝试更新与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);
    }

}

1 个答案:

答案 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,因为上下文不知道如何处理实体