Использование EntityFramework в C# при длительном использовании сущностей


Я борюсь со следующей проблемой.

У меня есть база данных с таблицей заданий, в которой содержится информация о выполняемых заданиях. Я следовал первому подходу кода EF 6.0 и создал класс POCO под названиемJob . Затем я запрашиваю базу данных для заданий:

DbSet<Job> receivedJobs;
using (var context = new MyContext())
{
    receivedJobs = (from j in context.Jobs
            select j);
}

С полученным набором receivedJobs я затем сделаю трудоемкую оптимизацию.

Как я понимаю, продолжительность жизни контекста, а также ресурсы контекста элементы управления заканчиваются заключительной скобкой оператора using. Кроме того, хороший дизайн должен освободить ресурсы для базы данных, как только он больше не требуется.

Мой вопрос теперь в том, что я должен делать в моем случае? Просто сохраняйте контекст базы данных живым, пока я не закончу свою трудоемкую задачу оптимизации. Или закройте соединение, поскольку оно не требуется, пока не закончится оптимизация. Но в последнем случае что мне делать с расположенными объектами Job , потому что тогда мне нужно будет получить доступ к некоторым навигационные свойства их, которые я не могу, потому что контекст был закрыт. (И кстати данные в экземплярах класса Job не будут изменены оптимизацией. Поэтому не требуется отслеживать изменения этих объектов, потому что их не будет)

Надеюсь, кто-нибудь поможет мне понять, какой дизайн рекомендуется в данном случае.

С наилучшими пожеланиями

2 3

2 ответа:

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

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

В вашем случае поместите оптимизационный код на место, используйте контекст до тех пор, пока код не будет завершен, а затем отпустите контекст. Ваше заявление об использовании позаботится обо всем грязном материале для утилизации. Просто получите ваш код, который нуждается в контексте в {} для использования, и вы должны быть хороши, чтобы пойти.

Хотя это не решит всех ваших проблем, особенно дизайнерских, знаете ли вы функцию "Включить", которая предварительно загружает навигационные свойства ваших заданий? Например, если задание указывает на список задач благодаря свойству с именем "задачи":

Context. Jobs. Include ("задачи") / / предварительно загрузит свойство Tasks ваша работа.

Контекст.Вакансии.Включить("Задачи.AllowedUsers") //подожми задачи свойство вашей работы и список разрешенных пользователей каждого из них задача.

Если вы хотите предварительно загрузить несколько свойств на одном уровне, просто используйте что-то вроде:

Контекст.Вакансии.Включить("Задачи").Включить("OtherTasksOnJob")