- Пул соединений связан с любым другим приложением ADO.NET. Соединение с сущностью по-прежнему использует традиционное соединение с традиционной цепочкой соединений. Я считаю, что вы можете отключить пул соединений в строке соединения, если вы не хотите его использовать. (подробнее о SQL Server Connection Pooling (ADO.NET))
- Никогда не используйте глобальный контекст. ObjectContext внутренне реализует несколько шаблонов, включая Identity Map и Unit of Work. Воздействие использования глобального контекста различно для каждого типа приложения.
- Для веб-приложений используется один контекст для каждого запроса. Для веб-служб используется один контекст для каждого звонка. В приложениях WinForms или WPF используйте единый контекст для каждой формы или для ведущего. Могут быть некоторые особые требования, которые не позволят использовать этот подход, но в большинстве случаев этого достаточно.
Если вы хотите узнать, какое влияние имеет контекст одного объекта для приложения WPF/WinForm, проверьте это article. Речь идет о сеансе NHibernate, но идея такая же.
Edit:
При использовании EF это по умолчанию нагрузок каждый объект только один раз в контексте. Первый запрос создает объект instace и сохраняет его внутри. Любой последующий запрос, требующий сущности с тем же ключом, возвращает этот сохраненный экземпляр. Если значения в хранилище данных изменились, вы все равно получаете объект со значениями из исходного запроса. Это называется Карточка идентификации карты. Вы можете заставить контекст объекта перезагрузить объект, но он перезагрузит один общий экземпляр.
Любые изменения, внесенные в объект, не сохраняются до тех пор, пока вы не позвоните по телефону SaveChanges
. Вы можете делать изменения в нескольких объектах и хранить их сразу.Это называется Единица измерения работы. Вы не можете выборочно указать, какой измененный прикрепленный объект вы хотите сохранить.
Объедините эти два шаблона, и вы увидите некоторые интересные эффекты. У вас есть только один экземпляр объекта для всего приложения. Любые изменения в объекте влияют на все приложение, даже если изменения еще не сохранены (совершены). В большинстве случаев это не то, что вы хотите. Предположим, что у вас есть форма редактирования в приложении WPF. Вы работаете с сущностью, и вы решаете отменить комплексное редактирование (изменение значений, добавление связанных объектов, удаление других связанных объектов и т. Д.). Но объект уже изменен в общем контексте. Что вы будете делать? Подсказка: я не знаю ни о каких CancelChanges или UndoChanges на ObjectContext
.
Думаю, нам не нужно обсуждать сценарий сервера. Простое совместное использование единого объекта среди нескольких HTTP-запросов или вызовов веб-служб делает ваше приложение бесполезным. Любой запрос может только активировать SaveChanges
и сохранять частичные данные из другого запроса, потому что вы используете единую единицу работы среди всех из них. Это также будет иметь другую проблему: контекст и любые манипуляции с сущностями в контексте или соединением с базой данных, используемым контекстом, не являются потокобезопасными.
Даже для приложения, использующего только для чтения, глобальный контекст не является хорошим выбором, потому что вы, вероятно, хотите получать свежие данные каждый раз, когда вы запрашиваете приложение.
Спасибо за ваш ответ. Возможно, вы могли бы объяснить, почему плохо использовать один глобальный контекст? Это делает параллельный доступ сложнее, конечно, но что еще ...? – Noldorin
Хорошо, теперь намного яснее, спасибо. Просто чтобы подтвердить, хотя глобальный контекст никогда не подходит, может быть, что один контекст для «диалогового окна редактирования» или такого может быть правильным? В других ситуациях, таких как веб-службы и ASP.NET, контексты внутри методов имеют смысл. О правильном? – Noldorin
Я принял ваш совет и удалил singelton. Теперь я получаю еще одну ошибку: http://stackoverflow.com/questions/14795899/an-entity-object-cannot-be-referenced-by-multiple-instances-of-ientitychangetrac –