mvc4 在事务中使用WebSecurity时出现MSDTC错误的解决方法
mvc4开发的时候需要用到事务,事务中使用WebSecurity.CurrentUserName获取用户名的时候出现“MSDTC on server is unavailable”。
下面介绍此问题的出现原因及解决方案。
说明:我是在使用Asp.net MVC4的EntityFramework5 CodeFirst开发的程序时遇到此类问题。
首先看一下有问题的代码
using (TransactionScope ts = new TransactionScope()) { //数据插入操作 db.Commit(); int sessionUid = WebSecurity.CurrentUserId; //此时出现异常“MSDTC on server is unavailable” ts.Complete(); }
这个异常的起因是websecurity使用自己的数据库连接,我的使用另一个连接,虽然我已经配置simplemembership使用相同的DbContext类作为我的库,但问题是它会创建一个新的实例中的DbContext的,这就会与事务using起冲突。
找到问题了,那就有两种方法去解决:
1:不用事务
2:将int sessionUid = WebSecurity.CurrentUserId 提前到事务之前