DbContext не будет держать соединение открытым для повторного использования - PullRequest
13 голосов
/ 19 июля 2011

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

Entity Framework (использующий новый DbContext API в выпуске 4.1), похоже, не хочет держать открыто открытое соединение открытым. Старый ObjectContext API поддерживает соединение открытым, как и ожидалось, и задокументировано .

Поскольку DbContext API просто использует ObjectContext под капотом, я бы ожидал того же поведения. Кто-нибудь знает, предназначено ли это изменение или известная проблема? Я не могу найти это нигде.

public void ConnectionRemainsOpen()
{
    using (var context = new TestDataContext())
    {
        try
        {
            Assert.AreEqual(ConnectionState.Closed, context.Database.Connection.State);

            context.Database.Connection.Open();

            var firstRecord = context.Table3.FirstOrDefault();

            // this Assert fails as State == ConnectionState.Closed
            Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);

            var newRecord = new Table3
            {
                Name = "test",
                CreatedTime = DateTime.UtcNow,
                ModifiedTime = DateTime.UtcNow
            };

            context.Table3.Add(newRecord);

            context.SaveChanges();

            // this Assert would also fail
            Assert.AreEqual(ConnectionState.Open, context.Database.Connection.State);
        }
        finally
        {
            if (context.Database.Connection.State == ConnectionState.Open)
                context.Database.Connection.Close();
        }
    }
}

1 Ответ

14 голосов
/ 19 июля 2011

Если вы хотите контролировать соединение, вы должны создать его до контекста и передать его в контекст, в противном случае соединение не находится под вашим контролем. Попробуйте что-то вроде:

using (var connection = ...)
{
    using (var context = new TestDataContext(connection, false))
    {
        ...
    }
}
...