我应该在每次更改后调用一次SaveChanges吗?

Ant*_*lia 7 c# asp.net asp.net-mvc entity-framework

我需要在我的控制器中对我的数据库进行一些更改.

foreach (var valueStream in model.ListValueStream)
{
    ValueStreamProduct vsp = new ValueStreamProduct(valueStream.Id, product.Id);
    db.ValueStreamProduct.Add(vsp);
}
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

Shoul我在最后或每次做出更改时都会调用SaveChanges?

Igo*_*gor 7

这取决于.

  1. 每次更改 - 如果您希望每个保存在其自己的事务中运行并独立于其他更改,则在循环中或在您进行更改后运行保存.请注意,如果代码中稍后出现故障,则已经发生的更改将保留,并且不会回滚.由于您要更多地往返数据存储,这也会带来更高的性能成本.有些情况可以保证这种用法,这里有两个简单的例子:
    1. 您希望将长时间运行的操作的进度跟踪回数据存储,并包括此前的更改.
    2. 您希望批量保存代码正在处理的大块数据,并且代码知道在发生故障时如何在最后一个保存点之后获取操作.
  2. 完成所有更改后 - 如果您希望获得更高的性能,并且希望所有保存都通过或失败,并在发生任何故障时回滚,则在循环外部或代码块末尾运行它们.现在,如果代码中出现故障(保存更改调用之前或之后的任何位置),则不会对商店保留任何更改.在大多数情况下,这是理想的行为,因为它可以确保数据存储的良好状态.通常,这可能是您希望代码执行的操作.


Lat*_*com 5

这取决于您的要求

要求1)三个表是独立的。

public ActionResult Create() 
{ 
     db.ValueStreamProduct.Add(vsp);
     db.tbl.Add(tbl2);
     db.tbl.Add(tbl3);

     // only one time you can call savechanges()
     db.SaveChanges();
 }
Run Code Online (Sandbox Code Playgroud)

要求 2) ValueStreamProduct 表 Id 对于 tbl2 是必需的。

但是,您需要获取第二个表的最后插入记录的 ID。像这样的代码

 public ActionResult Create() 
 {
     db.ValueStreamProduct.Add(vsp); 
     db.SaveChanges();

     // getting last inserted record's Id from ValueStreamProduct table.
     tbl2.Column = vsp.Id

     db.tbl.Add(tbl2);
     db.tbl.Add(tbl3);

     db.SaveChanges();
  }
Run Code Online (Sandbox Code Playgroud)

  • 如果数据库配置为 EF 代码优先方法并且存在导航属性,则并不总是需要这样做。 (2认同)