繁体   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