#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 не будет.