Ответ 1
- Пул соединений обрабатывается как в любом другом приложении ADO.NET. Соединение с сущностью по-прежнему использует традиционное соединение с традиционной цепочкой соединений. Я считаю, что вы можете отключить пул соединений в строке соединения, если вы не хотите его использовать. (подробнее о Пул соединений SQL Server (ADO.NET))
- Никогда не используйте глобальный контекст. ObjectContext внутренне реализует несколько шаблонов, включая Identity Map и Unit of Work. Воздействие использования глобального контекста различно для каждого типа приложения.
- Для веб-приложений используется один контекст для каждого запроса. Для веб-служб используется один контекст для каждого звонка. В приложениях WinForms или WPF используйте единый контекст для каждой формы или для ведущего. Могут быть некоторые особые требования, которые не позволят использовать этот подход, но в большинстве случаев этого достаточно.
Если вы хотите знать, какое влияние имеет контекст одного объекта для приложения WPF/WinForm, проверьте эту статью . Речь идет о сеансе NHibernate, но идея такая же.
Edit:
Когда вы используете EF, он по умолчанию загружает каждый объект только один раз для каждого контекста. Первый запрос создает объект instace и сохраняет его внутри. Любой последующий запрос, требующий сущности с тем же ключом, возвращает этот сохраненный экземпляр. Если значения в хранилище данных изменились, вы все равно получаете объект со значениями из исходного запроса. Это называется образ карты идентификации. Вы можете заставить контекст объекта перезагрузить объект, но он перезагрузит один общий экземпляр.
Любые изменения, внесенные в объект, не сохраняются, пока вы не вызываете SaveChanges
в контексте. Вы можете делать изменения в нескольких объектах и хранить их сразу. Это называется Структурой работы. Вы не можете выборочно указать, какой измененный прикрепленный объект вы хотите сохранить.
Объедините эти два шаблона, и вы увидите некоторые интересные эффекты. У вас есть только один экземпляр объекта для всего приложения. Любые изменения в объекте влияют на все приложение, даже если изменения еще не сохранены (совершены). В большинстве случаев это не то, что вы хотите. Предположим, что у вас есть форма редактирования в приложении WPF. Вы работаете с сущностью, и вы решаете отменить комплексное редактирование (изменение значений, добавление связанных объектов, удаление других связанных объектов и т.д.). Но объект уже изменен в общем контексте. Что вы будете делать? Подсказка: я не знаю ни о каких CancelChanges или UndoChanges на ObjectContext
.
Я думаю, нам не нужно обсуждать сценарий сервера. Простое совместное использование единого объекта среди нескольких HTTP-запросов или вызовов веб-служб делает ваше приложение бесполезным. Любой запрос может просто запускать SaveChanges
и сохранять частичные данные из другого запроса, потому что вы используете единую единицу работы среди всех из них. Это также будет иметь другую проблему: контекст и любые манипуляции с сущностями в контексте или соединение с базой данных, используемое контекстом, не являются потокобезопасными.
Даже для приложения с открытым исходным кодом глобальный контекст не является хорошим выбором, потому что вы, вероятно, хотите получать свежие данные каждый раз, когда вы запрашиваете приложение.