实体框架 - 循环后调用SaveChanges

5

SaveChanges 会保存所有的债务变化吗?还是只保存最后一次循环中因为我每次都更改了债务元素所以失去了引用?

List<DTO.ClientDebt> ClientDebtList = Business.Generic.GetAll<DTO.ClientDebt>();

foreach (var oClienteDeuda in oClienteDeudaSyncList) //oClienteDeudaSyncList is a list of debts
{
    DTO.ClientDebt debt = ClientDebtList.Where(x => x.ClienteId == oClienteDeuda.ClienteId && x.NumeroComprobante == oClienteDeuda.NumeroComprobante).FirstOrDefault();
    debt.Active = oClienteDeuda.Active ? 1 : 0;
}

Data.Generic.SaveChanges();

2
您提供的代码将更新ClientDebtList中的所有元素,您可能需要在设置debt.Active =之前添加一个if null检查... - Martin M
1
或者至少所有被触及的元素将会在数据库中得到更新。 - Martin M
2个回答

3
你所采用的方法是处理 foreach 循环的正确方法。你也可以在循环内部执行相同的操作,但这会大幅降低操作的性能。因此,一定要在 foreach 循环之后执行 SaveChanges() 方法。 SaveChanges() 方法将持久化对其连接的所有实体进行的修改。因此,你不需要担心引用更改等问题。它作为工作单元运行,这意味着要么全部保存,要么全部不保存。
注意: SaveChanges() 在事务中运行。如果任何脏的 ObjectStateEntry 对象无法持久化,SaveChanges() 将回滚该事务并抛出异常。

2

实体的更改是在内部进行监控的,因此只要您没有告诉实体框架跳过更改跟踪(例如,在查询中使用AsNotracking()),则不应该丢失任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接