Моя модель EF 4.3.1 имеет 200-нечетные таблицы. Начальный запуск ужасен, несколько минут. Профиль, захваченный DotTrace, подразумевает некоторые ужасные варианты алгоритма/масштабируемости в глубине структуры, о чем свидетельствуют миллионы вызовов ряда методов и 36 миллионов вызовов IEnumerable.Contains(). Вот фрагмент, все это вызвано первым запросом, сделанным в базе данных (будущие запросы этого не делают и все в порядке).
Что я могу сделать с моей моделью, чтобы сделать это менее болезненным? Могу ли я предварительно скомпоновать это? Лучше, может ли команда EF решить эти проблемы или открыть исходный код, чтобы я мог? Или, по крайней мере, исправить написание Warapper
?:)
EDIT: Один конкретный вызов EF, который вызывает это, в основном var db = new MyDbContext(); db.Personnel.Where(a => a.Login == login).SingleOrDefault();
. Также EF Migrations Seed() AddOrUpdate эффективно генерирует один и тот же стек. Более полная трассировка стека, которая может дать немного больше контекста, находится здесь: Полная трассировка стека
EDIT: Некоторые релевантные ссылки:
- MSDN: Рекомендации по производительности (Entity Framework) (благодаря @AakashM)
- MSDN: EF Power Tools
- SO: Entity Framework 4.1 для большого количества таблиц (715)
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