Ramy podmiotowe i kontekst rozporządzania

Kiedy należy wywołać {[3] } z entity framework?

  1. 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;
    }
    
  2. 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;
    }
    
  3. 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;
    }
    
Author: pquest, 2013-03-27

4 answers

W rzeczywistości są to dwa pytania w jednym:

  1. Kiedy powinienem użyć Dispose() kontekstu?
  2. Jaka powinna być długość życia mojego kontekstu?

Odpowiedzi:

  1. Nigdy 1. using jest implicit Dispose() w bloku try-finally. Oddzielna Instrukcja Dispose może zostać pominięta, gdy wyjątek wystąpi wcześniej. Ponadto, w większości przypadków, nie wywołanie Dispose w ogóle (w sposób dorozumiany lub jawny) nie jest szkodliwy .

  2. 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.

 87
Author: Gert Arnold,
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.

 27
Author: Daniel,
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.

 11
Author: Todd Menier,
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;
    }
}
 2
Author: A-Sharabiani,
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