EntityConnection и открытый SqlConnection - PullRequest
4 голосов
/ 19 марта 2012

У меня есть вопрос о EntityFramework с подходом CodeFirst.Основываясь на исходном коде EntityConnection и документации, я не могу создать его с уже открытым SqlConnection.Это требует, чтобы это было закрыто.У нас есть несколько разных слоев данных БД (nHibernate и т. Д.), И было бы хорошо, если бы мы могли повторно использовать один и тот же SqlConnection между ними.Но кажется, что EntityFramework не позволяет этого делать.Я могу передать закрытое SqlConnection в DbContext, но мне не подходит закрывать соединение для каждого DbContext.

Есть ли способ повторно использовать открытое sql-соединение?

EDIT

После того, как EF перешел на OpenSource, я смог его обновить.Единственная строка, которую я изменил, находится в конструкторе класса System.Data.Entity.Core.EntityClient.EntityConnection.

if (connection.State != ConnectionState.Closed)
{
//throw new ArgumentException(Strings.EntityClient_ConnectionMustBeClosed);
}

После того как я закомментировал исключение выброса, я могу повторно использовать существующее открытое соединение SQL и послеDBContext использовал его, он не будет закрывать, и он все еще был доступен для других вещей.

Мой пример кода:

var connection = new SqlConnection(connectionString);
connection.Open();

MetadataWorkspace workspace = GetWorkspace(connection); // I loaded it from the same context, and save it in memory.

EntityConnection eConnection = new EntityConnection(workspace, connection);

using(var context = new EFContext(connection, false))
{
    var someData = context.SomeTable.ToList();
}

connection.Close();

1 Ответ

5 голосов
/ 19 марта 2012

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

Обходным путем может быть создание контекста до использования других технологий доступа к данным и явное открытое соединение

objectContext.Connection.Open();

Теперь вы сможете повторно использовать SqlConnection внутри контекста контекста:

var dbConnection = ((EntityConnection)objectContext.Connection).StoreConnection;

Если вы используете DbContext API, я рекомендую вам прочитать эту статью для получения дополнительной информации о том, как решить проблему с DbContext.

...