2012-03-02 2 views
0

Я играю с Entity Framework, чтобы узнать, как его можно использовать в новом проекте, над которым я работаю. Я поместил свой файл edmx в библиотеку классов, чтобы Entities (и доступ к базе данных) можно было использовать в нескольких местах. В настоящее время у меня есть веб-проект и консольный проект, ссылающийся на библиотеку классов.Ссылки на Entity Framework и ObjectContext

В одном из моих объектов есть Partial класс, определенный статическим методом. Цель метода - принять некоторые параметры и создать один или несколько экземпляров конкретного класса. Моя первая версия метода создала экземпляр ObjectContext, создала класс Entity (или классы) и вернула Entities вызывающему методу. Затем вызывающий метод обновил некоторые свойства и попытался сохранить объекты с использованием нового экземпляра ObjectContext. Очевидно, это не сработало, потому что сущности были связаны (правильный термин?) С Контекстом, созданным в статическом методе.

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

Предполагая, что мой один статический метод может вырасти во многих других или что мое приложение (особенно веб-приложение), вероятно, выиграет от дополнительных уровней (DAL или даже уровня обслуживания), имеет ли смысл для всех этих классов требуется параметр ObjectContext?

Я читал много сообщений о том, что создание объекта ObjectContext с помощью шаблона Singleton является плохой идеей, потому что «многие клиенты будут использовать один и тот же объект». Моя проблема заключается в том, что я не вижу, как это возможно. В локальном приложении консоли есть только один пользователь, запускающий приложение. В веб-приложении для каждого запроса будет только один пользователь. Где проблема с совместным использованием пользователей? Ни одна статья/публикация не упоминала об этом ... но где они ссылаются на шаблон Singleton, хранящий экземпляр объекта в контексте приложения?

Я также видел публикации, посвященные веб-использованию и хранению экземпляра объекта в объекте Session пользователей через объект HttpContext. Это имеет смысл, но, похоже, не затрагивает использование не веб-сайтов.

Я думаю, что любое решение подходит (static methodm, Factory object и т. Д.), Скорее всего, будет реализовано в моей библиотеке классов, поэтому очевидно, что он должен поддерживать как сетевые, так и не-веб-решения. Возможно, проверьте HttpContext, чтобы определить, в какой среде он работает.

Я надеялся, что http://www.west-wind.com/weblog/posts/2008/Feb/05/Linq-to-SQL-DataContext-Lifetime-Management будет информативным, но мне тяжело обворачивать голову вокруг сообщения, а пример кода кажется излишним для создания экземпляра и совместного использования объект. (Хотя я уверен, что я просто не получаю это ...)

Любые мысли приветствуются.

Спасибо.

+0

(частично) дубликаты http://stackoverflow.com/questions/8927779/managing-entity-framework-objectcontext-in-asp-net –

ответ

0

Проблема заключается не в том, что «многие клиенты будут использовать один и тот же объект». Проблема заключается в том, что ObjectContext предназначен для одной единицы работы. Если вы используете его для разных подразделений, вы обнаружите, что существует ряд проблем.

  • Использование памяти будет расти и расти.
  • Ваше приложение будет работать медленнее, поскольку исправление объекта должно увеличивать объем работы.
  • Многопоточность не будет работать

Решение состоит в том, чтобы использовать ObjectContext в порядке, она предназначена, а именно, как одну единицу работы.