Я недавно работал с EF4.1 Code First, и все было хорошо (люблю MVC), но теперь начинаю сталкиваться с серьезными проблемами с производительностью.
У меня есть около 20 простых классов POCO, полученных из один базовый класс, использующий отображение наследования EF Table-Per-Type:
http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-2-table-per-type-tpt.aspx
EF дает мне хорошую чистую иерархию таблиц.Однако, если я теперь загружаю один объект из базы данных, например, это может занять несколько секунд:
DerivedClass derivedObject = context.Set<DerivedClass>().Find(id);
Я проверил, что отложенная загрузка включена и сузил проблему, используяSQL Profiler для SQL-запроса, созданного EF для извлечения объекта, который похож на структуру запроса здесь, но намного больше:
EF Code First: Извлечение базового типа запрашивает все таблицы производных типов
Поскольку у меня есть 20 подклассов, производных от одного базового класса, EF выполняет объединение SQL и объединяет все 20 таблиц (хотя мне нужны только данные из двух таблиц - для подклассов и базовых классов), создается таблица результатов с примерно 100 столбцами, представляющая собой общее количество свойств / столбцов в производных + базовых классах.Длина текстового запроса SQL составляет свыше 300 КБ , и выполнение запроса в SQL Server Management Studio на моем локальном компьютере занимает около 3 секунд для повторного получения одной строки данных, что является убийцей.
Я только что диагностировал эту проблему, поэтому буду признателен за любые отзывы по исправлению кода.Мои текущие мысли:
Сглаживание структуры объекта с использованием интерфейса вместо базового класса, копирование функциональности базового класса во все подклассы и денормализация структуры иерархии таблиц (денормализация неосновная проблема и, вероятно, будет более эффективной с точки зрения БД, но копирование функциональности базового класса будет болезненным.)
Создание sprocs для всех операций извлечения данных, включая отложенные вызовы загрузки (болезненно, но возможно)и легко пропустить звонок).
Помогите!Жертвую ли я OO или EF?!
Если кто-нибудь знает, как упростить запросы SQL, созданные EF, без необходимости реструктурировать мою структуру классов, это было бы еще лучше.