c# - 如何优化 Entity Framework 的添加/附加调用? (多对多插入)

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

我正在尝试做的事情:

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

我尝试过的:

我搜索过,但很多帖子都是关于 Context.SaveChanges() 变慢的。对我来说,Context.SaveChanges() 没问题。但是我在一个循环中有 Add()Attach() 调用,在调试中循环需要 37 秒运行 n < 150模式。

我试过关闭 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。 (避免因为我的工作场所最多可能会对此皱眉。)

问题:

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

(我只使用 Entity Framework 大约 6 个月,所以解释越多越好。)

最佳答案

基本上您不需要在循环中处理上下文,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();

关于c# - 如何优化 Entity Framework 的添加/附加调用? (多对多插入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46198889/

相关文章:

c# - 重载 ASP.NET MVC 操作

c# - 如何对邮件发送功能进行单元测试

c# - .NET Core 中的 HttpContext 和缓存 >= 1.0

c# - .NET是否有任何免费的OCR API?

c# - 转发器并在页面加载时将列添加到标题和项目模板

.net - 如何以编程方式判断 Word 宏是否是从 VB.Net/C# 签名的

c# - 尝试使用 "Input string was not in a correct format"显示小时部分时出现 'h' 错误

c# - 什么是将参数传递给 SQL,为什么我需要它?

.NET 6 如何添加Web服务引用

.net - 正则表达式头痛