这是一个简单的问题,我想和你们专家确认一下!
我正在更改同一数据库中两个不同表中的某些值。可以一次调用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;
}
答案 0 :(得分:4)
您可以在所有更新后调用Context.SaveChanges();
一次,它将保存之前完成的所有更改。
如果您希望更改/插入新对象,并希望根据数据库的实际值修改下一个对象,则可以调用Context.SaveChanges()
以便数据库得到更新。
在上下文中跟踪对实体的任何更改/插入,并且一旦调用SaveChanges
,它也会将更改放入数据库中。
还记住这一点: 来自MSDN:
SaveChanges在交易中运作。 SaveChanges将回滚 该事务并抛出异常,如果有任何脏 ObjectStateEntry对象不能保留。
答案 1 :(得分:0)
我认为最好一次调用它。如果你想要一个块执行,你可能还需要一个transactional code。
答案 2 :(得分:0)
从技术上讲,无论哪种方式都是合法的。
但是,正如Habib.OSU已经说过的那样,可能还有更多需要考虑的事情,比如你要保存的实体之间的依赖关系。有几种策略可以解决这个问题。
AND,如果您为每次循环迭代调用SaveChanges()
,这可能会导致严重的性能问题。