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