Entity Framework 6 Несколько Datacontext Обмен транзакцией

c# entity-framework-6

Вопрос

using(var Db = new Framework_DbContext())
{
    var DbContextTransaction = Db.Database.BeginTransaction(IsolationLevel.ReadUncommitted);
    using (var db = new DocumentLibDbContext())
    {
        //**How to use the above DbContextTransaction??**
        db.Database.UseTransaction(DbContextTransaction.UnderlyingTransaction);
    }
}

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

Вы не указали, подключены ли ваши контексты к одной базе данных или нет.

Если базы данных отличаются друг от друга, вам необходимо избегать BeginTransaction и UseTransaction и ускорить перенос кода в TransactionScope .

Предполагая, что они оба подключаются к одной базе данных, вы не указываете, используете ли вы EDMX или Code First. У меня была та же проблема с использованием EDMX, проведенной весь день с проб и ошибок и, наконец, придумал решение.

var workspace = new MetadataWorkspace(new[] { "res://*/" }, new[] { Assembly.GetExecutingAssembly() });
using (var connection = new SqlConnection("data source=.;initial catalog=MultpleEdmxTest;integrated security=True;MultipleActiveResultSets=True"))
{
    using (var entityConnection1 = new EntityConnection(workspace, connection, false))
    {
        using (var entityConnection2 = new EntityConnection(workspace, connection, false))
        {
            connection.Open();
            using (var transaction = connection.BeginTransaction())
            {
                using (var schema1Entities = new Schema1Entities(entityConnection1))
                {
                    schema1Entities.Database.UseTransaction(transaction);
                    // code goes here
                    schema1Entities.SaveChanges();
                }

                using (var schema2Entities = new Schema2Entities(entityConnection2))
                {
                    schema2Entities.Database.UseTransaction(transaction);
                    // code goes here
                    schema2Entities.SaveChanges();
                }
                transaction.Commit();
            }
        }
    }
}

Вы определяете дополнительные конструкторы в частичных классах следующим образом:

partial class Schema1Entities
{
    public Schema1Entities(DbConnection connection) : base(connection, false) { }
}

где false указывает, что вы открываете и закрываете соединение вручную.

В качестве бонуса теперь вам нужна только одна строка соединения в вашем конфиге, и она не включает в себя все бесполезные нежелательные EF, которые обычно идут с ним (metadata = res: // * / blabla).



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