【问题标题】:How to effectively refresh many to many relationship如何有效刷新多对多关系
【发布时间】:2011-12-08 17:52:56
【问题描述】:

假设我有实体 A,它与另一个 A 类型的实体有多对多的关系。所以在实体 A 上,我有 A 的集合。假设我必须根据某些外部服务“更新”这种关系- 我不时收到通知,某些实体的关系已更改,以及当前相关实体的 ID 数组 - 一些关系可能是新的,一些现有的,一些不再存在的......我怎样才能有效地更新我的数据库与英孚? 一些想法:

  1. 渴望加载实体及其相关实体,对来自外部服务的 ID 集合执行 foreach,并根据需要删除/添加。但这不是很有效 - 可能需要加载数百个相关实体

  2. 清除当前关系并插入新的。但是如何?也许通过存储过程执行删除,然后通过“假”对象插入

    a.Related.Add(new A { Id = idFromArray })
    

但这可以在事务中完成吗? (调用存储过程,然后由SaveChanges 完成插入)

或者有第三种方式吗?

谢谢。

【问题讨论】:

    标签: sql entity-framework entity-framework-4


    【解决方案1】:

    好的,找到解决方案。当然,纯 EF 解决方案是原始问题中提出的第一个解决方案。

    但是,如果性能很重要,还有第三种方式,最好的方式,尽管它是特定于 SQL 服务器的 (afaik) - 一种带有表值参数的过程。所有新的相关ID都进去,存储过程在事务中执行删除和插入。

    在此处查找示例和性能比较(很棒的文章,我的解决方案基于它):

    http://www.sommarskog.se/arrays-in-sql-2008.html

    【讨论】:

      【解决方案2】:

      嗯,“不时”听起来不像是考虑性能改进的情况(除非您的意思是“从毫秒到毫秒”):)

      无论如何,第一种方法是在没有存储过程的情况下进行此更新的正确想法。是的,您必须加载所有旧的相关实体,因为更新多对多关系仅在 EF 更改检测时进行。在没有加载导航属性的情况下,没有可以用来更新关系的公开外键。

      这里有一个详细的例子(昨天的新问题):

      Selecting & Updating Many-To-Many in Entity Framework 4

      (只有“编辑”部分之前的最后一个代码 sn-p 与您的问题和“编辑”部分本身相关。)

      对于您的第二个解决方案,您可以将整个操作包装到手动创建的事务中:

      using (var scope = new TransactionScope())
      {
          using (var context = new MyContext())
          {
              // ... Call Stored Procedure to delete relationships in link table
      
              // ... Insert fake objects for new relationships
      
              context.SaveChanges();
          }
          scope.Complete();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-16
        • 2017-08-04
        • 1970-01-01
        • 2021-07-26
        • 1970-01-01
        • 2017-01-30
        • 2020-03-05
        相关资源
        最近更新 更多