2

Можно ли совместно использовать одно соединение (и транзакцию) между операциями, выполненными в EF6 DB. Первый подход и некоторые операции ADO?База данных Entity Framework 6 Сначала - как обмениваться соединениями и транзакциями с ADO

Как я читаю здесь: https://msdn.microsoft.com/en-us/data/dn456843.aspx#existing можно разделить соединение и транзакции с EF v6, но я должен передать объект SqlConnection в качестве параметра конструктору класса контекста. Но если я делаю это в DB Первый подход, у меня есть UnintentionalCodeFirstException.

Как я читаю здесь: https://msdn.microsoft.com/en-us/data/jj592674 Я использую экземпляр EntityConnection в качестве параметра для конструктора класса контекста при использовании метода DB First. Но конструктор класса EntityConnection принимает только ЗАКРЫТЫЕ соединения. И поэтому я не могу обменять транзакцию, потому что соединение должно быть закрыто перед передачей в класс контекста.

Я прав, и невозможно разделить одно соединение в этом сценарии, или, может быть, есть другой способ?

Является ли TransactionScope единственным способом обертывания операций в EF 6 DB First и ADO в транзакции (с отдельными подключениями)?

+0

могли бы вы рассказать немного о том, почему вы хотите поделиться связь? –

+0

@RobTillie В приложении, с которым я работаю, часть кода все еще использует ADO, а другая часть использует EF. Я хочу обернуть операции в EF и ADO в транзакции. TransactionScope имеет некоторые ограничения, и MS рекомендует использовать один подход к подключению. Меньше соединений лучше. – wlodziu

+0

Вы можете взломать это с отражением. Я сделал это с помощью ef и sqlbulkcopy. Скопировать код Cant на данный момент. –

ответ

0

Я не могу вспомнить, откуда я это сделал, но это помогло мне с запуском EF и SqlBulkCopy в той же транзакции. Вот как захватить сделки с отражением от Entity Framework:

EntityConnection ec = (EntityConnection)Context.Connection; 
SqlConnection sc = (SqlConnection)ec.StoreConnection; 
SqlTransaction sqlTransaction = null; 

var parserProp = sc.GetType().GetProperty("Parser", BindingFlags.NonPublic | BindingFlags.Instance); 

if (parserProp != null) 
{ 
    var parser = parserProp.GetValue(sc, null); 
    var sqltxProp = parser.GetType().GetProperty("CurrentTransaction", BindingFlags.NonPublic | BindingFlags.Instance); 
    var currentTransaction = sqltxProp.GetValue(parser, null); 
    sqlTransaction = currentTransaction as SqlTransaction; 

    if (sqlTransaction == null) 
    { 
     var parentProp = currentTransaction.GetType().GetProperty("Parent", BindingFlags.NonPublic | BindingFlags.Instance); 
     currentTransaction = parentProp.GetValue(currentTransaction, null); 
     sqlTransaction = currentTransaction as SqlTransaction; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^