Как Entity Framework реализует Identity Map?

360
17 января 2018, 14:19

Предположим я отправляю запрос к базе данных и получаю 1000 объектов, если я отправлю этот запрос еще раз используя тот же объект DbContext, то я получу эти объекты из локального хранилища. А если при обработке другого запроса asp.net приложение в то же время или с небольшой разницей (например 0.5 секунд) отправит к базе данных такой же sql запрос, обратиться ли ef к базе данных вновь?

Есть у меня таблица, которая редко обновляется и может без проблем целиком поместиться в оперативной памяти. Можно ли кешировать ее и обновлять только, например, каждые 24 часа? (я имею в виду средствами фреймворка, а не статической коллекцией в сервисе)

Answer 1

Entity Framework не поддерживает такой сценарий. В версиях до 6-й EF существенно замедлялся, если в DbContext появлялось множество объектов, поэтому стандартный сценарий работы с ним — короткое время жизни.

В веб-приложении удобнее всего делать время жизни таким же, как время жизни веб-запроса, в этом случае все операции, выполняемые в рамках обработки запроса, заворачиваются в транзакции. Как правило, именно это и нужно.

Что касается кеширования, то решение этой задачи без тестов производительности скорее всего преждевременная оптимизация. Если таблица небольшая и изменяется очень редко, сам SQL-сервер будет её прекрасно кешировать. Во-первых, она, вероятно, поместиться в одну страницу данных (8Кбайт) и SQL-сервер будет подгружать её за одно обращение к диску; во-вторых, если она регулярно запрашивается, то будет просто находиться в кеше SQL-сервера; в-третьих, если никто в неё не пишет, не будет никаких блокировок.

Если же кеширование в будущем потребуется, его можно добавить средствами аспектного программирования: разработать кешируещие декораторы для репозиториев. Эти декораторы могли бы проверять, есть ли данные в кеше. В случае их отсутствия, декораторы запрашивают данные из базы и помещают в кеш. С помощью концепции перехватчиков (interceptors), реализованной у мощных IoC-контейнеров, такие декораторы могут оказаться очень простыми в разработке.

READ ALSO
Mocking Linq2db DataConnection

Mocking Linq2db DataConnection

Доброго времени суток!

683
Как использовать переменные из цикла? C#

Как использовать переменные из цикла? C#

Например, я создал переменные a1,a2,a3

287
В чем отличие между .NET Core SDK и .NET Core Runtime?

В чем отличие между .NET Core SDK и .NET Core Runtime?

В чем отличие междуNET Core SDK и

332
Библиотека для склонения по падежам

Библиотека для склонения по падежам

На просторах интернета пруд пруди онлайн-сервисов, но хочется чего-нибудь автономного

386