부모 개체에 자식 개체를 추가하는 것이 매우 느려지는 문제가 있습니다. 수만 개의 자식 개체 (이 경우 33k 개의 레코드)가 있지만 그 중 아무 것도 해당 부모 개체의 자식이 아닙니다.엔티티 프레임 워크 속도가 느려질 때 느려짐
나는 부모에게 첫 번째 자식을 추가가 완료 될 때까지 1 분 이상 걸리는 경우 :
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의 속도 문제를 찾아 접근하는 가장 좋은 방법은 무엇입니까?
업데이트 : 그것은 단지 현재의 아이 만 그들을로드해야 할 때,
SELECT * FROM ChildEntities where ParentId = id
SELECT * FROM ChildEntities where WarehouseId = id2
SELECT * FROM ChildEntities where WarehouseLocation = id3
는 왜 매일 ChildEntity 이러한로드 않습니다 EFProf이 세 가지 SQL 쿼리를 발행하는 것을 보여줍니다?
편집 2 : @LadislavMrnka에 따라 추가 쿼리는 템플릿의 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 = 새 ChildEntity {Foo = "", Bar = "", 부모 = 부모}; _ entityService.Save (자식)' –
그리고 엔티티의 내부를 보려면 EF Profiler (http://efprof.com/)를 사용하십시오. 뼈대. –
'부모 '엔티티에 많은 수의 ChildEntities가 있습니까? – Eranga