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