Как быстро загрузить всю базу данных с помощью EF

#database #entity-framework #entity-framework-4 #eager-loading

#База данных #entity-framework #entity-framework-4 #быстрая загрузка

Вопрос:

Моя база данных состоит из 5 таблиц с ~ 10000 объединенными строками. Это занимает ~ 1 МБ в SQL Server CE, который находится в общей папке. Сама база данных представляет собой иерархию Страна-Регион-Город-Улица-Здание. Я использую Entity Framework 4.

Поскольку база данных небольшая, пользователи могут просматривать и редактировать все 2000 городов в WPF ListView. Но при каждом подходе, который я пробовал до сих пор, графический интерфейс работает медленно (из-за многих обходов базы данных, графический интерфейс с фиктивными данными работает быстро). Как я могу загрузить всю базу данных в память с помощью одного или нескольких обходов базы данных?

Я пробовал несколько, Include() но заметил большое снижение производительности, как описано здесь

Должен ли я написать свой собственный ORM-light? Я мог бы также использовать обычные файлы ascii CSV вместо базы данных, но это, очевидно, исключило бы параллелизм.

Ответ №1:

Честно говоря, я сам делал что-то подобное, и ответом для меня было скопировать всю базу данных локально и работать с ней.

Если вы хотите не только читать, но и писать, я бы определенно посоветовал отказаться от CE и установить одну из экспресс-версий Sql Server. Они предназначены для такого рода ситуаций; CE — нет *.

* Пакет SP1 лучше подходит для параллельного доступа, но по сети он никогда не будет эффективен для больших наборов данных.

Ответ №2:

Я повторно задал этот вопрос на форуме Microsoft, и они были любезны дать мне некоторые рекомендации:

В принципе, мой вопрос можно сформулировать следующим образом:

  • чтение только один раз из базы данных при запуске приложения
  • выполняйте все последующие запросы из локальных данных, а не из базы данных (для повышения производительности)
  • записывайте как в контекст, так и в базу данных каждый раз, когда добавляется или удаляется объект.

С обычным EF это невозможно, потому что каждый запрос отправляется в базу данных. Это означает, что я должен быстро считывать данные при запуске, а затем кэшировать их.

Подробности реализации:

Кажется, лучшим способом является использование ESQL для быстрого импорта данных и последующего их кэширования, например, с использованием объектов, не связанных с контекстом. Судя по моим первым экспериментам, это работает хорошо.

Комментарии:

1. EF реализует шаблон IdentityMap, поэтому все ваши сущности кэшируются внутри контекста. Итак, если вы загрузите все объекты в контекст, дальнейших запросов к DB не будет.