Мы используем Linq-to-SQL DataContext в веб-приложении, которое предоставляет приложению данные только для чтения и никогда не обновляется (для обеспечения этого установите ObjectTrackingEnabled = false.
Поскольку данныеникогда не меняется (за исключением периодических обновлений конфигурации), кажется расточительным перезагружать его из SQL Server с новым DataContext для каждого веб-запроса.
Мы пытались кэшировать DataContext в объекте Application для всех запросов на использование, ноэто породило много ошибок, и наше исследование показывает, что это плохая идея, DataContext должен быть удален в пределах одной и той же единицы работы, а не потокобезопасен и т. д. и т. д.
Так как DataContext являетсянамеревался быть механизмом доступа к данным, а не хранилищем данных, нам нужно смотреть на кэширование данных, которые мы получаем из него, а не на сам контекст.
Предпочел бы делать это с самими сущностями и коллекциями.поэтому код может не зависеть от того, имеет ли он дело с кэшированными или «свежими» данными.
Как это можно сделать безопасно?
Во-первых, мне нужно убедиться, что сущности и коллекции полностью загружены, прежде чем я избавлюсь от DataContext.Есть ли способ для удобной принудительной полной загрузки всего из базы данных?
Во-вторых, я вполне уверен, что хранение ссылок на сущности и коллекции - плохая идея, потому что это будет либо
(a) вызывает повреждение объектов, когда DataContext выходит из области видимости или
(b) предотвращает выход DataContext из области действия
Поэтому я должен клонировать EntitySets и сохранитьих?Если так, то как?Или что здесь?