Инициализация Entity Framework выполняется МЕДЛЕННО — что я могу сделать, чтобы запустить ее быстрее?

Моя модель EF 4.3.1 имеет 200 с лишним таблиц. Первоначальный запуск ужасный, несколько минут. Профиль, захваченный DotTrace, предполагает ужасный выбор алгоритма/масштабируемости глубоко внутри фреймворка, о чем свидетельствуют миллионы вызовов ряда методов и 36 миллионов вызовов IEnumerable.Contains(). Вот фрагмент, все это запускается первым запросом, выполненным в базе данных (будущие запросы не делают этого и в порядке).

enter image description here

Что я могу сделать с моей моделью, чтобы сделать это менее болезненным? Могу ли я предварительно скомпилировать это как-то? Лучше, может ли команда EF решить эти проблемы или открыть исходный код фреймворка, чтобы я мог? Или хотя бы исправить написание Warapper? :)

РЕДАКТИРОВАТЬ: один конкретный вызов EF, который запускает это, в основном var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();. Кроме того, EF Migrations Seed() AddOrUpdate эффективно генерирует тот же стек. Более полная трассировка стека, которая может дать немного больше контекста, находится здесь: Полная трассировка стека

EDIT: некоторые соответствующие ссылки:

EDIT2: Теперь, когда они просто открыли код, кажется, что эта строка:

//Filter the 1:1 foreign key associations to the ones relating the sets used in these cell wrappers.
oneToOneForeignKeyAssociationsForThisWrapper =
    oneToOneForeignKeyAssociationsForThisWrapper.Where(
        it => (it.AssociationEndMembers.All(endMember => entityTypes.Contains(endMember.GetEntityType()))));

требует доработки. Он использует алгоритм O (n ^ 2), хотя, вероятно, в этом нет необходимости, но я еще не присматривался.

EDIT3: К счастью, похоже, что работа в EF6 исправляет этот код: http://entityframework.codeplex.com/discussions/396130

36
задан Community 23 May 2017 в 12:13
поделиться