Ramy podmiotowe i kontekst rozporządzania
Kiedy należy wywołać {[3] } z entity framework?
-
Czy ta wyimaginowana metoda jest zła?
public static string GetName(string userId) { var context = new DomainDbContext(); var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); return userName; }
-
Tak lepiej?
public static string GetName(string userId) { string userName; using(var context = new DomainDbContext()) { userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); } return userName; }
-
Czy to jeszcze lepiej, to znaczy, jeśli nie nazwać kontekstu.Dispose () podczas używania using ()?
public static string GetName(string userId) { string userName; using(var context = new DomainDbContext()) { userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); } return userName; }
4 answers
W rzeczywistości są to dwa pytania w jednym:
- Kiedy powinienem użyć
Dispose()
kontekstu? - Jaka powinna być długość życia mojego kontekstu?
Odpowiedzi:
Nigdy 1.
using
jest implicitDispose()
w blokutry-finally
. Oddzielna InstrukcjaDispose
może zostać pominięta, gdy wyjątek wystąpi wcześniej. Ponadto, w większości przypadków, nie wywołanieDispose
w ogóle (w sposób dorozumiany lub jawny) nie jest szkodliwy .Zobacz np. Entity Framework 4 - długość życia / zakres kontekstu w aplikacji winform . Krótko mówiąc: długość życia powinna być "krótka", statyczny kontekst jest zły.
1 jak niektórzy komentowali, wyjątek od tej reguły stanowi sytuacja, gdy kontekst jest częścią komponentu, który implementuje IDisposable
sam i dzieli swój cykl życia. W takim przypadku wywołałbyś context.Dispose()
w metodzie Dispose
komponentu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:30
Śledziłem kilka dobrych tutoriali do korzystania z EF i nie pozbywają się kontekstu.
Byłem trochę ciekaw tego i zauważyłem, że nawet szanowany Microsoft VIP nie pozbywa się kontekstu. Odkryłem, że nie musisz pozbywać się dbContext w normalnej sytuacji.
Jeśli chcesz więcej informacji, możesz przeczytać ten wpis na blogu , który podsumowuje dlaczego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-03 16:43:13
Jeszcze lepiej:
public static string GetName(string userId)
{
using (var context = new DomainDbContext()) {
return context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
}
}
Nie ma potrzeby zwracania wyniku spoza zakresu using
; po prostu zwróć go natychmiast, a nadal uzyskasz pożądane zachowanie usuwania.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-16 20:03:31
Możesz zdefiniować kontekst bazy danych jako pole klasy i zaimplementować IDisposable
. Coś jak poniżej:
public class MyCoolDBManager : IDisposable
{
// Define the context here.
private DomainDbContext _db;
// Constructor.
public MyCoolDBManager()
{
// Create a new instance of the context.
_db = new DomainDbContext();
}
// Your method.
public string GetName(string userId)
{
string userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
return userName;
}
// Implement dispose method.
// NOTE: It is better to follow the Dispose pattern.
public void Dispose()
{
_db.dispose();
_db = null;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-05 21:39:00