Entity Framework中的SaveChanges是否会包装数据库事务中的所有更改

joh*_* Gu 3 asp.net-mvc entity-framework transactions asp.net-mvc-5

我在我的asp.net mvc web应用程序中有以下方法,我使用Ado.net实体框架来映射我当前的数据库表: -

public void changeDeviceSwitch(int fromID , int toID)
{
     var currentdevices = tms.TMSSwitchPorts.Where(a => a.SwitchID == fromID);
     foreach (var d in currentdevices)
     {
          tms.TMSSwitchPorts.Remove(d);            
     }
     foreach (var d in currentdevices)
     {
          TMSSwitchPort tsp = new TMSSwitchPort() 
                { SwitchID = toID,
                  TechnologyID = d.TechnologyID,
                  PortNumber = d.PortNumber };
          tms.TMSSwitchPorts.Add(d);
     }
     tms.SaveChanges();    
}
Run Code Online (Sandbox Code Playgroud)

我的上述方法将在数据库中生成多个删除和添加操作.所以说它会导致5个删除操作和5个插入操作,在这种情况下会调用我的情况下的SaveChangies(),将10个操作包装在一个数据库事务中?所以要么所有的更改都发生了,要么都没有?谢谢

Adm*_*vić 5

这是正确的,SaveChanges就像事务一样意味着什么都没有发生,直到你明确地调用它(没有发送给DB),一旦你调用它,一切都会立即发送,如果一个查询/命令失败,将不会保持任何更改.

但是,如果您希望批量发送查询到SQL,但仍将它们视为单个事务,则可以查看实体框架6提供的内容(MSDN文章).基本上,您可以在一个大事务中包装多个SaveChanges,如果发送到SQL的任何查询/命令失败,在任何批次中,它将允许您回滚所有内容.