如何在Entity Framework 5及.NET Framework 4中执行回滚操作?
在Entity Framework 5 + .NET Framework 4环境下执行回滚操作的问题解答
我来帮你梳理下这两个问题,结合EF5和.NET Framework4的特性逐一解答:
疑问1:是否必须调用db.SaveChanges(),仅调用db.usp_UpdateRoleUser是否足够?
在EF5中,你调用的db.usp_UpdateRoleUser这类自动生成的存储过程方法,本质是直接向数据库发送执行命令的,不需要额外调用db.SaveChanges()。因为这类方法并没有把操作加入EF的变更跟踪上下文,而是立即执行了数据库操作——也就是说,你调用这个方法的瞬间,数据库里的变更就已经发生了。所以你当前代码里的SaveChanges()在这里是多余的,完全可以不用加。
疑问2://rollback注释处应编写什么代码?
当前代码的核心问题是没有开启数据库事务,所以当存储过程执行完成后,不管返回的影响行数是多少,数据库操作已经被自动提交了,根本没法回滚。要实现回滚逻辑,你需要先手动开启EF事务,再根据执行结果决定提交还是回滚,具体代码修改如下:
public static bool UpdateRoleUser(int component_type, string oldRole, string oldUser, string oldAuth_value, string newRole, string newUser, string newAuth_value) { using (var db = new VMIEntities()) { // 开启数据库事务 using (var transaction = db.Database.BeginTransaction()) { try { int recordAffected = db.usp_UpdateRoleUser(newRole, newUser, newAuth_value, oldRole, oldUser, oldAuth_value, component_type); if (recordAffected == 1) { // 提交事务 transaction.Commit(); return true; } else { // 回滚事务 transaction.Rollback(); return false; } } catch (Exception ex) { // 发生异常时也要回滚事务,避免数据不一致 transaction.Rollback(); // 这里可以根据需求添加日志记录等异常处理逻辑 throw; } } } }
额外补充:加异常捕获是很有必要的——如果存储过程执行过程中抛出异常,同样需要回滚事务,防止数据库出现半完成的变更。
内容的提问来源于stack exchange,提问作者Pop
相关产品推荐
相关产品推荐

