Entity Framework и вызов context.dispose()

Когда следует вызывать DbContext.dispose() со структурой сущностей?

  1. Этот мнимый метод плох?

    public static string GetName(string userId)
    {
        var context = new DomainDbContext();
        var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        context.Dispose();
        return userName;
    }
    
  2. Это лучше?

    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. Это даже лучше, то есть НЕ следует вызывать context.Dispose() при использовании using()?

    public static string GetName(string userId)
    {
        string userName;
        using(var context = new DomainDbContext()) {
            userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
        }
        return userName;
    }
    
+60
27 мар. '13 в 18:38
источник поделиться
5 ответов

На самом деле это два вопроса в одном:

  1. Когда я должен Dispose() от контекста?
  2. Какой должна быть продолжительность жизни моего контекста?

ответы:

  1. Никогда 1. using является неявным Dispose() в блоке try-finally. Отдельный оператор Dispose может быть пропущен, если исключение возникает раньше. Кроме того, в большинстве распространенных случаев вообще не вызывать Dispose (неявно или явно) не вредно.

  2. См., Например, Entity Framework 4 - продолжительность жизни/контекст контекста в приложении winform. Короче говоря: продолжительность жизни должна быть "короткой", статический контекст плохой.


1 Как отмечают некоторые люди, исключением из этого правила является случай, когда контекст является частью компонента, который сам реализует IDisposable и разделяет его жизненный цикл. В этом случае вы бы context.Dispose() в методе Dispose компонента.

+94
27 мар. '13 в 18:52
источник

Я следил за хорошими учебниками, чтобы использовать EF, и они не нарушают контекст.

Мне было немного любопытно, и я заметил, что даже уважаемый Microsoft VIP не нарушает контекст. Я обнаружил, что вам не нужно удалять dbContext в нормальной ситуации.

Если вам нужна дополнительная информация, вы можете прочитать этот пост в блоге, в котором кратко объясняется, почему.

+35
21 июн. '14 в 15:09
источник

Связанные вопросы


Похожие вопросы

Еще лучше:

public static string GetName(string userId)
{
    using (var context = new DomainDbContext()) {
        return context.UserNameItems.FirstOrDefault(x => x.UserId == userId);
    }
}

Не нужно возвращать результат извне области using; просто верните его немедленно, и вы все равно получите желаемое поведение.

+13
16 апр. '15 в 20:03
источник

Вы можете определить контекст вашей базы данных как поле класса и реализовать IDisposable. Что-то вроде ниже:

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 = _db.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;
    }
}
+3
05 дек. '16 в 21:39
источник

Я бы использовал вариант 3; используя using(), вы автоматически разместите контекст для вас. Вариант 2 плох. Вариант 1 также может быть в порядке, но вариант 3 кажется более читаемым.

0
27 мар. '13 в 18:45
источник

Посмотрите другие вопросы по меткам или Задайте вопрос