Как решить начальный очень медленный вызов EF Entity, который использует TPH и сложные типы? - PullRequest
1 голос
/ 01 апреля 2019

Я использую EF6

У меня есть общая таблица, которая содержит данные для различных типов объектов классов, используя подход «Таблица на иерархию». Кроме того, эти объекты класса используют сложные типы для определения типов для их свойств.

Итак, используя вымышленный пример,

Стол = Человек

«Майк Учитель» - это «Учитель», экземпляр Person с personType «Учителя»

Экземпляр "Учитель" имеет 2 свойства: complextypePersonalDetails и complextypeAddress.

complextypePersonalDetails содержит Имя, Фамилия и Возраст.

complextypeAddress содержит HouseName, улица, город, город, округ.

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

Я выполняю профилирование кода с помощью JetBrains DotTrace.

При первом звонке, скажем, на personTeacher = db.person.OfType (). First ()

Я получаю огромную задержку около 150 000 мс

вокруг:

     SerializedGeneratedViewOfType (150,000ms)
          TryGenerateQueryViewOfType
               GenerateTypeSpecificQueryView
                    GenerateQueryViewForSingleExtent
                        GenerateQueryViewForExtentAndType
                           GenerateViewsForExtentAndType
                              GenerateViewComponents
                                 EnsureExtentIsFullyMapped (90,000ms)
                                 GenerateCaseStatements    (60,000ms)

Я создал предварительно сгенерированное представление, используя пакет nuget "InteractivePreGeneratedViews", который создает SQL. Однако даже с этим мне все еще нужно подвергнуться моему первому удару. Кроме того, похоже, что это происходит каждый раз при перезапуске веб-сервера / веб-сайта / AppPool.

Я не совсем уверен в процессе EF, но я полагаю, что при запуске веб-приложения есть еще одна форма компиляции или кэширования во время выполнения. Где это может происходить, и есть ли упреждающий метод, который я мог бы использовать, чтобы прегенерировать / прекомпилировать / предварительно кэшировать эту проблему.

В среднесрочной перспективе мы перепишем этот код в Dapper или EF.Core. Итак, пока что есть мысли о том, что можно сделать?

Спасибо.

1 Ответ

3 голосов
/ 04 апреля 2019

Я уже прокомментировал это раньше, но отказался от него, но согласился только с тем, что «этот дизайн может быть чрезмерным, и проблема может заключаться в моем создании», но я подумал, что увижу, если кто-нибудь еще подскочит.

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

void Application_Start(object sender, EventArgs e)
{
  // Initialization stuff...

  using (var context = new MyContext())
  {
     var result = context.MyTable.Any(); // Spin up will happen here, not when the first user attempts to access a query.
  }
}

На самом деле вам нужно запустить запрос для DbContext, чтобы разрешить сопоставление, просто новое обновление не сделает этого.

Для более крупных или более сложных схем вы можете также использовать ограниченные контексты, где каждый контекст отображает определенный набор отношений для определенной области приложения. Чем менее сложен / понятен контекст, тем быстрее он инициализируется.

Что касается дизайна, TPH предназначен для представления наследования, в котором вам необходимо установить отношение «есть» между похожими объектами. Реляционные модели и ORM по определению могут поддерживать это, но они больше ориентированы на отношения «есть». Вместо того, чтобы иметь модель, в которой вы говорите «человек с адресом», лучше всего выявляется связь, которую человек может «иметь» по адресу. Я работал над системой, которая была разработана командой инженеров, где вся система отчетности с динамическими правилами была представлена ​​6 таблицами. Честно говоря, эти проекты - кошмарный сон.

...