为什么我不能像这样将 Changes() 保存到我的 DbContext?



我有一些代码用于插入一些不起作用的行:

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的一个新实例,这在上面的情况下实现效率会更低。这是真的吗?

编辑

忽略这个问题。两个版本似乎都有效。我不知道问题出在哪里。我不会删除它,因为其他人可能会觉得其中的一些评论/答案很有用。

我不知道您使用的是哪个上下文,但是,在乐观并发冲突方面,LINQ to SQL SubmitChanges的行为与LINQ to Entitie的SaveChanges不同。

提交更改=数据上下文
保存更改=对象上下文

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();
}

我认为您正在处理这里的闭包。

试试这个代码是否适合你:

using (MyDbContext context = new MyDbContext())
{
foreach (Order o in FormOrders)
{
Order localCopy = o;
context.Orders.Add(localCopy);
}
context.SaveChanges();
}

简而言之,您的Add()方法将只执行一次。由于执行延迟,将只添加循环的最后一项。

(引用Jon的文章链接如下)

什么是闭包

简单地说,闭包允许您封装一些行为,像任何其他对象一样传递它,并且仍然可以访问到它们最初声明的上下文。这允许您将控制结构、逻辑运算符等与它们将如何使用的详细信息。访问原始上下文是将闭包与普通对象区分开来的东西,尽管闭包实现通常使用普通实现对象和编译器的诡计。

专家们会比我更好地解释这一点:

  • 微软的Eric Lippert:结束循环变量被认为是有害的
  • 谷歌Jon Skeet:闭包之美

最新更新