Próbuję ponownie użyć istniejącego połączenia z bazą danych, aby móc wykonywać wiele operacji na bazach danych przy użyciu TransactionScope
bez wywoływania usługi MSDTC.DbContext nie pozostawi połączenia otwartego do ponownego użycia
Entity Framework (przy użyciu nowego interfejsu API DbContext
w wydaniu 4.1) nie chce, aby otwarcie jawnie otwartego połączenia było otwarte. Stary interfejs API ObjectContext
utrzymuje połączenie otwarte zgodnie z oczekiwaniami i documented.
Od DbContext
API po prostu używa ObjectContext
pod maską, oczekiwałbym tego samego zachowania. Czy ktoś wie, czy ta zmiana jest zamierzona, czy znany problem? Nie mogę znaleźć nigdzie udokumentowanej dokumentacji.
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();
}
}
}
Jeśli umieścisz Asert po Open(), ale przed pierwszym zapytaniem, jaki jest wynik? Zastanawiam się, czy problem polega właśnie na tym, że zwraca on nieprawidłową wartość, a nie na zamykaniu i ponownym otwieraniu połączeń. – Tridus
@Tridus, sugerowane przez Ciebie Asert zawiera oczekiwany wynik 'Open'. – GWB
Zdaję sobie sprawę, że jest to stary wpis, ale właśnie czytałem książkę Julii Lerman, a używana przez nią składnia to context.Connection.Open() (tzn. Brak bazy danych między kontekstem a połączeniem). Tylko myśl. – Tod