我正在尝试做的事情:
我有一张用户表和一张网桥表。网桥和用户之间的关系是多对多的。我得到了一个用户和一个 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/