2012-03-15 3 views
2

Я пытаюсь настроить транзакцию, в которой мой код создает нового пользователя с использованием поставщика членства, а затем продолжает создавать объект и помещать его в одну из моих Entity Framework столы. Если операция EF завершается неудачно, я хочу иметь возможность отката до того, как пользователь будет создан. У меня есть единственная строка соединения для EF и членства, поэтому я думаю, что обе операции должны использовать одно и то же соединение sql.Использование TransactionScope с Entity Framework первым и универсальным провайдером

Когда я первый запустить его, я получаю

"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(); 

ответ

0

Как говорят у даже и использовать ту же строку подключения для обоих EF и членство в них используются различные соединения, то область транзакции автоматически возрастающими ДТК

И, насколько я знаю использовать такое же соединение для обоих

это не представляется возможным поставить пользовательское соединение в SqlMembershipProvider

согласно this link

, чтобы избежать вовлечения DTC