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

时间:2016-10-05 14:42:42

标签: 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();

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

3 个答案:

答案 0 :(得分:6)

这取决于。

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

答案 1 :(得分:1)

最后,所有已完成的更改将以较少的数据库访问和较少的开销来保存

答案 2 :(得分:1)

这取决于您的要求

要求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();
 }

要求2)对于tbl2,必须使用ValueStreamProduct表。

但是,您需要获取最后插入记录的第二个表的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();
  }