Контекст Entity Framework - PullRequest
       3

Контекст Entity Framework

0 голосов
/ 22 ноября 2011

Сначала у меня есть приложение, использующее код Entity Framework. Моя установка состоит в том, что у меня есть основной сервис, от которого наследуются все другие сервисы. Базовая служба содержит следующий код:

public static DatabaseContext db = new DatabaseContext();

    public CoreService()
    {
        db.Database.Initialize(force: false);
    }

Затем другой класс унаследует от CoreService, и, когда ему понадобится выполнить запрос к базе данных, он просто запустит такой код, как:

db.Products.Where(blah => blah.IsEnabled);

Тем не менее, я, кажется, получаю противоречивые истории о том, какая из них лучше.

Некоторые люди советуют НЕ делать то, что я делаю.

Другие люди говорят, что вы должны определить контекст для каждого класса (а не использовать базовый класс для его создания)

Другие говорят, что для КАЖДОГО вызова базы данных я должен обернуть его в блок использования. Я никогда не видел этого ни в одном из примеров от Microsoft.

Может кто-нибудь уточнить?

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

Ответы [ 3 ]

1 голос
/ 25 ноября 2011

Вы должны обернуть один контекст для каждого веб-запроса. Держите его открытым столько, сколько вам нужно, затем избавьтесь от него, когда закончите. Вот для чего используется.

НЕ оборачивайте свой контекст в синглтон. Это не очень хорошая идея.

Если вы работаете с такими клиентами, как WinForms, я думаю, вы бы обернули контекст вокруг каждой формы, но это не моя область.

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

Наконец, вы видели эту практику от MS, поскольку многие вещи ADO поддерживают обертывание в использовании, но вряд ли кто-то это осознает.

0 голосов
/ 22 ноября 2011

Конфликты, которые вы получаете, не связаны с разделением контекста между классами, а вызваны объявлением static вашего контекста.Если вы сделаете контекст полем instance вашего класса обслуживания, чтобы у каждого экземпляра службы был свой собственный контекст, проблем не должно быть.требуется, но вместо этого вы должны убедиться, что context.Dispose() вызывается в распоряжении службы.

0 голосов
/ 22 ноября 2011

Предлагаю использовать принцип дизайна «предпочитаю композицию наследованию».Вы можете иметь ссылку на контекст базы данных в вашем базовом классе.Реализуйте единый объект для получения DataContext и назначьте текстовый текст данных этой ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...