Структура Entity Framework и контекст

Когда нужно вызвать 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; } 

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

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

ответы:

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

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


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

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

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

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

Еще лучше:

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

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

Вы можете определить свой контекст базы данных как поле classа и реализовать 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 = 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; } } 
  • Код Framework Entity Сначала: как комментировать внешний ключ для значения «По умолчанию»?
  • Entity Framework Include OrderBy random генерирует повторяющиеся данные
  • Каскадные удаления с помощью Entity Framework - Связанные объекты, удаленные EF
  • MVC3 и Entity Framework
  • Json.Net добавляет $ id к объектам EF, несмотря на то, что PreserveReferencesHandling указывает на "None"
  • Давайте будем гением компьютера.