Почему TransactionScope не работает с Entity Framework?

.net c# entity-framework transactions transactionscope

Вопрос

Смотрите код ниже. Если я инициализирую более одного контекста сущности, то получаю следующее исключение только для 2-го набора кода . Если я закомментирую второй набор, он работает.

{"Основной провайдер не удалось открыть."}

Внутренний: {"Не удалось установить связь с соответствующим менеджером транзакций."}

Внутренний: {"Ошибка HRESULT E_FAIL была возвращена от вызова к компоненту COM."}

Обратите внимание, что это пример приложения, и я знаю, что не имеет смысла создавать 2 контекста подряд. Однако у производственного кода есть причина для создания нескольких контекстов в одном TransactionScope , и это нельзя изменить.

редактировать

Вот предыдущий вопрос о том, как я пытался настроить MS-DTC. Кажется, он включен как на сервере, так и на клиенте. Я не уверен, правильно ли он настроен. Также обратите внимание, что одной из причин, по которой я пытаюсь это сделать, является то, что существующий код в TransactionScope использует ADO.NET и Linq 2 Sql ... Я бы хотел, чтобы те также использовали ту же транзакцию. (Возможно, это звучит безумно, но мне нужно, чтобы это работало, если это возможно).

Как мне использовать TransactionScope в C #?

Решение

Брандмауэр Windows блокировал подключения к MS-DTC.

using(TransactionScope ts = new System.Transactions.TransactionScope())
        {
                using (DatabaseEntityModel o = new DatabaseEntityModel())
                {
                    var v = (from s in o.Advertiser select s).First();
                    v.AcceptableLength = 1;
                    o.SaveChanges();
                }

                //-> By commenting out this section, it works
                using (DatabaseEntityModel o = new DatabaseEntityModel())
                {
                    //Exception on this next line
                    var v = (from s1 in o.Advertiser select s1).First();                         v.AcceptableLength = 1;
                    o.SaveChanges();
                }
                //->

                ts.Complete();
        }

Принятый ответ

Ваш MS-DTC (координатор распределенных транзакций) по какой-то причине не работает должным образом. MS-DTC используется для координации результатов транзакций по нескольким разнородным ресурсам, включая несколько SQL-соединений.

Посмотрите на эту ссылку для получения дополнительной информации о том, что происходит.

По сути, если вы убедитесь, что ваш MS-DTC работает и работает должным образом, у вас не должно возникнуть проблем с использованием двух соединений ADO.NET - будь то соединения с объектной структурой или любой другой тип.


Популярные ответы

Вы можете избежать использования распределенной транзакции, управляя своим собственным EntityConnection и передавая это EntityConnection вашему ObjectContext. В противном случае проверьте это.

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=580828&SiteID=1&mode=1 http://forums.microsoft.com/msdn/showpost.aspx?postid=113669&siteid=1&sb=0&d=1&at=7&ft = 11 & тс = 0 & PageId = 1

EntityConnection conn = new EntityConnection(ConnectionString);

using (TransactionScope ts = new TransactionScope())
{
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
            var v = (from s in o.Advertiser select s).First();
            v.AcceptableLength = 1;
    }

    //-> By commenting out this section, it works
    using (DatabaseEntityModel o = new DatabaseEntityModel(conn))
    {
        //Exception on this next line
        var v = (from s1 in o.Advertiser select s1).First();
                v.AcceptableLength = 1;
    }
    //->

    ts.Complete();
}


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему