2012-03-19 4 views
3

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

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

EDIT

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

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

После того как я прокомментировал исключение броска, я могу иметь возможность повторно использовать существующие открыли SQL Connection, и после того, как 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(); 
+0

Вы используете [этот конструктор] (http://msdn.microsoft.com/en-us/library/gg696604 (v = vs.103) .aspx)? – Eranga

+0

Да, я попробовал, но для этого требуется закрытое соединение. –

ответ

5

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

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

objectContext.Connection.Open(); 

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

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

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

+0

Спасибо. Ваш ответ очень полезен. –

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