LINQ中的Context.SaveChanges()

时间:2012-06-21 11:08:14

标签: c# .net linq

这是一个简单的问题,我想和你们专家确认一下!

我正在更改同一数据库中两个不同表中的某些值。可以一次调用SaveChanges来更新全部吗?似乎工作,但我想知道它是否正常或需要在每次更新后调用context.SaveChanges?

bool success = false;
TestSuiteDB context = new TestSuiteDB();

var workstyle1 = context.WorkStyle.Where(d => d.WorkStyleId==21 && d.MemberId==1).ToList();
foreach (var ws1 in workstyle1)
{
    ws1.ModuleId = flid1;
}

var workstyle2 = context.WorkStyle.Where(d => d.WorkStyleId == 22 && d.MemberId==1).ToList();
foreach (var ws2 in workstyle2)
{
    ws2.ModuleId = flid2;
}

var workstylemodules1 = context.WorkStyleModules.Where(d => d.WorkStyleModuleId == 2 && d.MemberId == 1).ToList();
foreach (var ws1 in workstylemodules1)
{
    ws1.ModuleId = flid1;
}

var workstylemodules2 = context.WorkStyleModules.Where(d => d.WorkStyleModuleId == 3 && d.MemberId == 1).ToList();
foreach (var ws2 in workstylemodules2)
{
    ws2.ModuleId = flid2;
}

if (context.SaveChanges() > 0)
{
    success = true;
}

3 个答案:

答案 0 :(得分:4)

您可以在所有更新后调用Context.SaveChanges(); 一次,它将保存之前完成的所有更改。

如果您希望更改/插入新对象,并希望根据数据库的实际值修改下一个对象,则可以调用Context.SaveChanges()以便数据库得到更新。

在上下文中跟踪对实体的任何更改/插入,并且一旦调用SaveChanges,它也会将更改放入数据库中。

还记住这一点: 来自MSDN

  

SaveChanges在交易中运作。 SaveChanges将回滚   该事务并抛出异常,如果有任何脏   ObjectStateEntry对象不能保留。

答案 1 :(得分:0)

我认为最好一次调用它。如果你想要一个块执行,你可能还需要一个transactional code

答案 2 :(得分:0)

从技术上讲,无论哪种方式都是合法的。

但是,正如Habib.OSU已经说过的那样,可能还有更多需要考虑的事情,比如你要保存的实体之间的依赖关系。有几种策略可以解决这个问题。

AND,如果您为每次循环迭代调用SaveChanges(),这可能会导致严重的性能问题