我有一些代码用于插入一些无效的行:
using (MyDbContext context = new MyDbContext()) {
foreach (Order o in FormOrders) { //That's a List<T> that got generated based on a web form
context.Orders.Add(o);
}
context.SaveChanges();
}
我终于想出了如何让它发挥作用:
foreach (Order o in FormOrders) {
context.Orders.Add(o);
context.SaveChanges();
}
但是,我意识到效率不高。当然,一次插入的大多数订单大约是40,但我仍然对尽可能多地使用最佳实践感兴趣。
我猜测代码snippit#1不起作用,因为o
超出了调用SaveChanges()
的范围,但是我不明白它是如何工作得很好的当然,我完全不明白它是什么更好的方法。
另外,我听说你应该为每一行使用一个新的DbContext实例,在上面的例子中实现效率会更低。这是真的吗?
修改
不理会这个问题。两个版本似乎都有效。我不知道问题是什么。我没有删除它,因为其他人可能会发现一些有用的评论/答案。
答案 0 :(得分:0)
我不知道你正在使用哪个上下文但是,鉴于乐观并发冲突,LINQ to SQL SubmitChanges的行为与LINQ to Entitie的SaveChanges的行为不同。
SubmitChanges = DataContext
SaveChanges = ObjectContext
using (MyDbContext context = new MyDbContext()) {
foreach (Order o in FormOrders) { //That's a List<T> that got generated based on a web form
context.Orders.Add(o);
}
context.SubmitChanges();
}
答案 1 :(得分:0)
我认为你在这里处理闭包。
尝试此代码是否适合您:
using (MyDbContext context = new MyDbContext())
{
foreach (Order o in FormOrders)
{
Order localCopy = o;
context.Orders.Add(localCopy);
}
context.SaveChanges();
}
简而言之,您的Add()方法将仅执行ONCE。由于执行延迟,只会添加循环的最后一项。
(引自Jon的文章链接如下)
什么是关闭?
简单地说,闭包允许你封装一些 行为,像任何其他对象一样传递,仍然可以访问 到他们第一次宣布的背景。这允许你 将控制结构,逻辑运算符等从中分离出来 他们将如何使用的详细信息。能够访问 原始上下文是将闭包与普通对象分开的原因, 虽然闭包实现通常使用normal来实现 对象和编译器技巧。
专家们会比我更好地解释这个问题: