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

时间:2012-11-28 20:09:59

标签: asp.net sql-server asp.net-mvc database entity-framework

我有一些代码用于插入一些无效的行:

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实例,在上面的例子中实现效率会更低。这是真的吗?

修改

不理会这个问题。两个版本似乎都有效。我不知道问题是什么。我没有删除它,因为其他人可能会发现一些有用的评论/答案。

2 个答案:

答案 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来实现   对象和编译器技巧。

专家们会比我更好地解释这个问题:

相关问题