У меня интересные результаты тестирования производительности, и я нашел виновника.Я не видел подобной информации ни в одном источнике EF, который когда-либо читал.
Оказывается, что в базовом классе это равно переопределению Equals.Базовый класс должен содержать свойство Id, общее для всех типов конкретных сущностей.Такой подход рекомендован многими книгами EF и довольно хорошо известен.Вы можете найти его здесь, например: Как лучше всего реализовать Equals для пользовательских типов?
Точнее говоря, производительность снижается из-за операции распаковки (преобразования объекта в конкретный тип), которая заставила его работать такмедленный.Когда я прокомментировал эту строку кода, потребовалось 3 секунды, чтобы пройти противоположно до 90 секунд раньше!
public override bool Equals ( object obj )
{
// This line of code made the code so slow
var entityBase = obj as EntityBase;
...
}
Когда я нашел это, я начал думать над тем, что может быть альтернативой этим Равным.Первой идеей было реализовать IEquatable для EntityBase, но он вообще не запускался.Итак, в конце концов я решил реализовать IEquatable для каждого конкретного класса сущностей в моей модели.У меня их всего несколько, поэтому для меня это небольшое обновление.Вы можете поместить всю функциональность операции Equal (обычно это сравнение двух идентификаторов объектов) в метод расширения для совместного использования между конкретными классами сущностей и запустить его следующим образом: Equal ((EntityBase) ConcreteEntityClass).Самое интересное, этот IEquatable ускоряет EntitySet.Add в 6 раз!
Так что у меня больше нет проблем с производительностью, этот код выполняется для меня менее чем за секунду. Я получил увеличение производительности в 180 раз !Удивительно!
Заключение :
- Самый быстрый способ запуска EntitySet.Add - иметь IEquatable для конкретной сущности (0,5 с)
- Отсутствие IEquatable заставляет его работать 3 сек.
- Наличие Equals (объектный объект), который рекомендует большинство источников, заставляет его работать 90 секунд