У меня проблема с добавлением дочернего объекта к родительскому объекту исключительно медленным, когда этого не должно быть. В этом случае есть десятки тысяч дочерних объектов (в этом случае записи 33k), но ни один из них не является дочерним объектом родительского объекта.Медленность Entity Framework, когда должна быть скорость
Когда я добавляю первый ребенок к родителю занимает более одной минуты, чтобы закончить:
public class ParentEntity // POCO generated by EF TT4 templates
{
public virtual int Id { get; set; }
public virtual ICollection<ChildEntity> ChildEntities {}
}
public class ChildEntity // POCO generated by EF TT4 templates
{
public virtual int Id { get; set; }
public virtual int ParentEntityId { get; set; }
public virtual ParentEntity ParentEntity { get; set; }
public virtual Warehouse Warehouse { get; set; }
public virtual WarehouseLocation WarehouseLocation { get; set; }
}
public class Warehouse { // etc } // another POCO class
public class WarehouseLocation { // etc } // another POCO class
// somewhere in a controller action method...
var parent = _parentEntityService.GetBy(id);
var child = new ChildEntity{ ParentEntityId = id,
WarehouseId = id2, WarehouseLocationId = id3 };
// ChildEntities.Add() takes more than one minute to add the
// first and only child to this parent
// why would this be so incredibly slow?
parent.ChildEntities.Add(child);
Каков наилучший способ приблизиться к поиску проблемы скорости в EntityFramework?
Update: ЭфПроф показывает, что он выдает три SQL запросов:
SELECT * FROM ChildEntities where ParentId = id
SELECT * FROM ChildEntities where WarehouseId = id2
SELECT * FROM ChildEntities where WarehouseLocation = id3
Почему загружать их для каждого ChildEntity, когда это нужно просто загрузить их только для текущего ребенка?
Редактировать 2: Согласно @LadislavMrnka дополнительные запросы вызваны методом Fixup шаблона. Но когда я комментирую эти методы и комментирую звонок Fixup, он все еще медленный. Разве это не правильный способ, чтобы удалить FixUp (похоже, что он удаляется мне):
public class ChildEntity {
public virtual Warehouse Warehouse
{
get { return _warehouse; }
set
{
if (!ReferenceEquals(_warehouse, value))
{
var previousValue = _warehouse;
_warehouse = value;
//FixupWarehouse(previousValue); // commented out
}
}
}
Попробуйте изменить это следующим образом: 'var parent = _parentEntityService.GetBy (id); var child = new ChildEntity {Foo = "", Bar = "", Parent = parent}; _ entityService.Save (child) ' –
И используйте EF Profiler (http://efprof.com/), чтобы увидеть внутренность объекта фреймворк. –
Имеет ли этот «родительский» объект большое количество «ChildEntities»? – Eranga