2013-03-07 2 views
1

В настоящее время я использую Entity Framework для создания веб-сайта в asp.net, и мне было интересно, что это хороший способ создать экземпляр Entity Container?Хорошие практики структуры сущностей

В настоящее время я делаю это (где MyDB моя сущность структура контейнера):

public partial class User : System.Web.UI.MasterPage 
{ 
    private myDb ctx; 
     protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) ctx = new myDb(); 
    } 
} 

И я использовать контекст во многих функциях.

Но на многих сайтах, я видел этот способ справиться с этим:

using (var ctx = new myDb()) 
{ 
} 

Но если использовать второй, я должен поставить его во многих функциях моего класса. И поэтому повторно создайте экземпляр Entity Container.

Что лучше? Не могли бы вы объяснить мне, почему это лучше, и если оба они хороши, почему я должен использовать один, а другой в разных случаях.

+2

В вашем случае вы можете называть 'ctx.Dispose(); 'в событии' Page_Unload' и получите тот же эффект, что и 'using (var ctx = new myDb()) {}'. –

+0

Спасибо за ответ. Каковы хорошие случаи для метода использования? –

+1

'using' работает над классами, реализующими' IDisposable'. Когда исполняемый блок заканчивается, вызывается метод '.Dispose()'. И вы удаляете объект для освобождения ресурсов и освобождения памяти. Для объекта базы данных в вашем примере это также закрывает соединение с базой данных. –

ответ

2

pratice увода Entity Container происходит от Habbit избавления дорогих ресурсов, таких как SQL подключений к базе данных, как

using (SqlConnection connection = new SqlConnection(connectionString)) 
{} 

Однако, то Entity Framework достаточно умна, чтобы открыть соединение только тогда, когда запросы выполняются так Entity Container не представляют собой соединение sql. Таким образом, в этом смысле нет реального преимущества, кроме сбора мусора чуть раньше.

Кроме того, если вы используете контекст, вы не можете использовать ленивую загрузку. Вы должны использовать данные, связанные с нагрузкой, с Include. Дополнительная информация здесь Entity Framework - Load Reference Keys after disposing entity object context

Таким образом, я не вижу недостатков в одном контексте для каждого запроса. Напротив, никакая ленивая загрузка не является важным недостатком для меня.

1

Я думал, что вместо этого добавлю свои комментарии.

В вашем случае, вы могли бы назвать ctx.Dispose(); в Page_Unload событии и добиться того же эффекта, как

using (var ctx = new myDb()) 
{ 
} 

using работ по классам, реализующих IDisposable. Когда используется блок использования, вызывается метод .Dispose(). И вы удаляете объект для освобождения ресурсов и освобождения памяти. Объект базы данных в вашем примере наследует от DbContext и реализует IDisposable, поэтому, когда вызывается Dispose(), он также закроет соединение с базой данных.

Это, конечно, будет удобно, если у вас будет много запросов. Вы не хотите, чтобы тысячи открытых подключений к базе данных и много занимаемой памяти.

Одна вещь, которую нужно обратить внимание - если есть какие-либо необработанные исключения, брошенные до Page_Unload, то событие unload не будет запущено, а объект базы данных не будет удален.

Тогда лучше использовать using, так как он всегда вызывает .Dispose() на объектах.

Смежные вопросы