【问题标题】:How to update related data using entity framework 6如何使用实体框架6更新相关数据
【发布时间】:2015-07-31 19:42:45
【问题描述】:

我有一个实体Person,它有一个相关的实体Hobby。这是一个多对多的关系,一个人可以有几个爱好,一个爱好可以与很多人相关联。我想创建一个ViewModel,它允许添加新的爱好和/或从给定的 Person 实体中删除现有的爱好。

下面的代码有效,但我想它效率很低。

var newHobbies = new List<Hobby>();

foreach (Hobby hobby in vm.Hobbies)
{
    var originalHobby = db.Hobbies.Find(hobby.HobbyID);
    newHobbies.Add(originalHobby);
}

originalPerson.Hobbies = newHobbies;

我更喜欢这样做:

var newHobbies = db.Hobbies.Where(x => vm.Hobbies.All(y => x.HobbyID == y.HobbyID)).ToList();   
originalPerson.Hobbies = newHobbies;

但我得到一个错误:

这里只支持原始类型或枚举类型 上下文。

如何在不多次访问数据库的情况下更新相关数据?

【问题讨论】:

  • '我想它效率很低':一个人可能有多少爱好?以难以察觉的方式减少执行时间并不值得让代码更加晦涩难懂。
  • 好点。可能不超过 10 个。一天中只有这么多时间。

标签: c# asp.net-mvc entity-framework entity-framework-6


【解决方案1】:

为避免该异常,您可以先从 vm.Hobbies 集合中选择 Id,然后过滤您需要的爱好:

var Ids=vm.Hobbies.Select(x=>x.HobbyID);

var newHobbies = db.Hobbies.Where(x => Ids.Contains(x.HobbyID)).ToList();
// another option could be: db.Hobbies.Where(x => Ids.Any(id=>id==x.HobbyID)).ToList();    
originalPerson.Hobbies = newHobbies;

【讨论】:

    【解决方案2】:

    消息说您不能在 LINQ-to-Entities 查询中使用 vm.Hobbies,只能使用原始类型。这是你可以做的:

    var hobbyIds = vm.Hobbies.Select(h => h.HobbyId).ToList();
    var newHobbies = db.Hobbies.Where(x => hobbyIds.Contains(x.HobbyID)).ToList();
    

    【讨论】:

      【解决方案3】:

      整体结构是这样的:

      • 您的视图采用显示爱好列表的视图模型
      • 您有一个操作来添加一个新的 Hobby,并将 Hobby 实体作为操作的一部分传回
      • 您只需调用数据库即可创建PersonHobby 之间的新关联
      • Hobby 实体添加到Person 中的集合中
      • 将视图模型返回给视图

      一般来说,当您尝试将实体作为整个实体进行交互并且不要尝试对自己的 ID、实体水合等进行微观管理时,EF 和 MVC 会更容易使用。

      【讨论】:

      • 更新现有的爱好怎么样?如果我只是添加它们,我的爱好表不会有重复吗?
      • 您只需添加新的。
      【解决方案4】:

      您可以通过 ID 加入而不是从数据库中获取数据:

      originalPerson.Hobbies = db.Hobbies.Join(vm.Hobbies, h => h.ID, 
          v => v.HobbyID, (h, v) => h).ToList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多