Подтвердить что ты не робот

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

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

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

Поскольку API DbContext просто использует 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();
        }
    }
}
4b9b3361

Ответ 1

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

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