使用TransactionScope与实体框架代码首先和通用提供程序

时间:2012-03-15 12:45:50

标签: asp.net-membership transactionscope

我正在尝试设置一个事务,我的代码使用成员资格提供程序创建一个新用户,然后继续创建一个对象并将其放入我的一个Entity Framework表中。如果EF操作失败,我希望能够在创建用户之前回滚到。我有一个EF和成员资格的连接字符串,所以我认为这两个操作应该使用相同的SQL连接。

当我第一次运行它时,我得到了一个

  

“服务器上的MSDTC ...不可用。”

Membership.CreateUser行上的

异常。当我启动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();

1 个答案:

答案 0 :(得分:0)

正如你所说,即使你为EF和会员使用相同的连接字符串,他们使用不同的连接,然后事务范围自动升级到DTC

据我所知,两者都使用相同的连接

  

无法将自定义连接放入SqlMembershipProvider

     

根据this link

避免涉及DTC