我正在尝试设置一个事务,我的代码使用成员资格提供程序创建一个新用户,然后继续创建一个对象并将其放入我的一个Entity Framework表中。如果EF操作失败,我希望能够在创建用户之前回滚到。我有一个EF和成员资格的连接字符串,所以我认为这两个操作应该使用相同的SQL连接。
当我第一次运行它时,我得到了一个
Membership.CreateUser行上的“服务器上的MSDTC ...不可用。”
异常。当我启动DTC服务时,我得到了
带有内部异常的“基础提供商在开放时失败了”
异常
“该操作对交易状态无效。”
在同一条线上。如果我更改顺序并首先执行EF保存然后执行成员身份,则EF部分可以正常工作,但CreateUser会失败并出现相同的异常。
即使我有一个连接字符串,似乎正在使用2个sql连接。有没有办法强制成员资格和EF操作使用相同的连接,还是有其他方法将其置于事务中?
这是代码
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
MembershipCreateStatus createStatus;
MembershipUser user = Membership.CreateUser(model.UserName, model.Password, model.UserName, null, null, true, null, out createStatus);
//add objects to the DbContext db
db.SaveChanges();
scope.Complete();
答案 0 :(得分:0)
正如你所说,即使你为EF和会员使用相同的连接字符串,他们使用不同的连接,然后事务范围自动升级到DTC
据我所知,两者都使用相同的连接
无法将自定义连接放入SqlMembershipProvider
避免涉及DTC