Структура Entity Framework и контекст
Когда нужно вызвать DbContext.dispose()
с инфраструктурой сущностей?
-
Является ли этот мнимый метод плохим?
public static string GetName(string userId) { var context = new DomainDbContext(); var userName = context.UserNameItems.FirstOrDefault(x => x.UserId == userId); context.Dispose(); return userName; }
-
Это лучше?
- Код Entity Framework Сначала поддерживаются хранимые процедуры?
- Почему структура Entity Framework не может видеть информацию о столбце хранимой процедуры?
- ADO.NET Генератор DbContext или ADO.NET Poco Entity Generator (ObjectContext)
- Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
- Каковы минусы отключения ProxyCreationEnabled для CTP5 кода EF
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; }
-
Это еще лучше, то есть, если НЕ следует вызывать 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; }
- Пакетное обновление / удаление EF5
- MVC, EF - экземпляр SingleContextContext Per-Web-Request в Unity
- Какова цель объектов самоконтроля?
- Отключить ленивую загрузку по умолчанию в Entity Framework 4
- От многих до многих отношений не сохраняется
- Как включить дочерний объект дочернего объекта в Entity Framework 5
- Entity Framework DB-First, реализовать наследование
- Обновление EF 4 EDMX до EF 6
На самом деле это два вопроса в одном:
- Когда следует использовать
Dispose()
контекста? - Какова должна быть продолжительность моего контекста?
ответы:
-
Никогда 1 .
using
– неявноеDispose()
в блокеtry-finally
. Отдельный операторDispose
может быть пропущен, когда исключение происходит раньше. Кроме того, в большинстве распространенных случаев не вызыватьDispose
вообще (неявно или явно) не является вредным . -
См., Например, 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; } }