EntityConnection может быть создан только с закрытым DbConnection - PullRequest
3 голосов
/ 25 августа 2011

«EntityConnection может быть создан только с закрытым DbConnection». Это проблема, с которой я сталкиваюсь, когда пытаюсь создать сущность, обеспечивающую открытое соединение.Открыта транзакция, и я не хочу открывать новое соединение, иначе транзакция будет преобразована в транзакцию DCTC, так как я понимаю, что если я использую один SqlConnection для нескольких entityConnections, мне не нужен DTC.

Итак, мой код примерно такой.

Заранее спасибо ...

    using (TransactionScope transactionScope = new TransactionScope())
{

    using (SqlConnection dwConn = GetDWConnection(user)) 
    {
        dwConn.Open();
        // I need to do some SQlConnection specific actions first

        //EntityConnection specific actions next
        Func1(dwConn);
        Func2(dwConn); //similar to Func1()
        Func3(dwConn); //Similar to Func1()

    }

}
    Func1(SqlConnection dwConn)
    {
        using (EntityConnection conn = GetSQLEntityConnection(sqlConnection))
        {
            ObjectContext objectContext = (ObjectContext)Activator.CreateInstance(objectContextType, new object[] { conn });
            //few actions
        }
    }
    private EntityConnection GetSQLEntityConnection(SqlConnection sqlConnection)
        {
        //few steps
            EntityConnection entityConnection = new EntityConnection(entityConnectionStringBuilder.ToString());

            EntityConnection sqlEntityConnection = new EntityConnection(entityConnection.GetMetadataWorkspace(),sqlConnection);
            return sqlEntityConnection;
        }

Ответы [ 2 ]

2 голосов
/ 14 ноября 2012

Якуб совершенно прав. Вы не можете создать ни DbContext, ни EntityConnection с открытыми DbConnection, переданными им.

Согласно сообщению Диего Б Веги эта проблема не будет исправлена ​​до выхода EF 6 ( здесь вы можете проголосовать за него)

Обходной путь - открыть уже инициализированный EntityConnection перед любыми операциями, связанными с ним.

Учитывая ObjectContext, вы можете открыть EntityConnection следующим образом:

((EntityConnection)objectContext.Connection).Open();

В случае DbContext EntityConnection доступен из базового ObjectContext. Код может быть таким:

class MyDbContext : DbContext
{
    public MyDbContext (DbConnection connection) 
                  : base (connection, contextOwnsConnection: true)
    {
        ((IObjectContextAdapter)this).ObjectContext.Connection.Open();
    }

    // …
}

class Program
{
    public static void Main()
    {
        var connection = new SqlConnection(CONNECTION_STRING);
        using (var database = new MyDbContext(connection))
        {
            Assert.IsTrue(connection.State == ConnectionState.Open);
        }
        Assert.IsTrue(connection.State == ConnectionState.Closed);
    }
}
0 голосов
/ 25 августа 2011

Как вы уже узнали, вы не можете создать новый EntityConnection из открытого соединения.

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

...