【问题标题】:How do I optimize my Add/Attach calls for Entity Framework? (many-to-many insert)如何优化 Entity Framework 的 Add/Attach 调用? (多对多插入)
【发布时间】:2017-09-13 13:28:10
【问题描述】:

我想要做什么:

我有一张用户表和一张网桥表。网桥和用户之间的关系是多对多的。我得到了一个用户和一个 IEnumerable 网桥,我正在尝试将用户添加到 IEnumerable 中的每个网桥。

我的尝试:

我已经搜索过,但很多帖子都是关于 Context.SaveChanges() 很慢。对我来说,Context.SaveChanges() 很好。但是我在循环中有Add()Attach() 调用,并且在调试模式下,循环需要 37 秒才能运行 n 。

我试过关闭AutoDetectChangesEnabled,但似乎我依赖于它。

Context.Configuration.ValidateOnSaveEnabled = false;
Context.USER.Add(user);
Context.USER.Attach(user);
foreach(BRIDGE bridge in bridges)
{
    Context.BRIDGE.Add(bridge);
    Context.BRIDGE.Attach(bridge);
    bridge.USER.Add(user);    
}

int result =  Context.SaveChanges();
Context.Configuration.ValidateOnSaveEnabled = true;
return result;

我的选择(据我所知):

  • 重定向用户并异步执行操作。 (避免,因为我想在完成后给用户一些反馈)。

  • 只需让用户等待。

  • 将相关信息发送到存储过程并让存储过程SELECT 桥接并执行INSERT。 (避免,因为我的工作场所可能充其量会对此皱眉头。)

问题:

有什么方法可以让循环运行得更快,还是我被卡住了?

(我只使用实体框架大约 6 个月,所以解释越多越好。)

【问题讨论】:

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


    【解决方案1】:

    基本上你不需要在循环中使用上下文,EF 会保存你的整个对象图,你可以这样做:

    foreach(BRIDGE bridge in bridges)
    {
        //Context.BRIDGE.Add(bridge); remove this line
        //Context.BRIDGE.Attach(bridge); remove this line
        bridge.USER.Add(user);    
    }
    
    Context.BRIDGE.AddRange(bridges);    
    
    Context.SaveChanges();
    

    【讨论】:

    • 非常感谢。我的代码基于this post(Ctrl-F“第二种情况,数据已存在于表中...”),但在这种情况下,它无需添加/附加即可工作。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2020-11-05
    • 2018-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多