2017-10-09 1 views
3

엔티티 프레임 워크 6에서 AsNoTracking 및 LazyLoadingEnabled = false으로 엔티티를로드하고 싶습니다. 일부 특수한 경우에 일부 콜렉션을 명시 적으로 다시로드하고자합니다. 분리 된 엔티티 컬렉션을 명시 적으로로드하려면 어떻게해야합니까?엔티티 프레임 워크 컨텍스트에 기존 엔티티를 제네릭으로 첨부하려면 어떻게합니까?

기존 엔티티를 컨텍스트에 연결하는 일반 옵션을 찾고 있습니다.

내 호출은 다음과 같습니다

var myCar = await this.myCarRepositoryAccessor.GetById(this.UnitOfWork, 1).ConfigureAwait(false); 
this.UnitOfWork.LoadCollection(myCar, e => e.Driver); 

GetById 같은 외모와 DataRepository에서 :

처럼의 UnitOfWork에서
public Task<TEntity> GetById(int id) 
{ 
    return id == 0 
     ? Task.FromResult(default(TEntity)) 
     : this.Context.InternalSet<TEntity>().AsNoTracking()?.SingleOrDefaultAsync(p => p.Id == id); 
} 

LoadCollection 보이는 : 내가 설정하려고 한

public void LoadCollection<TEntity, TElement>(TEntity entity, Expression<Func<TEntity, ICollection<TElement>>> navigationProperty) where TEntity : class, IEntity where TElement : class 
{ 
    //this.context.Entry(entity).State = EntityState.Unchanged 
    this.context.Entry(entity).Collection(navigationProperty).Load(); 
} 

엔티티 상태는 Unchanged이지만 다음과 같은 오류 메시지가 표시됩니다.

동일한 유형의 다른 엔터티에 이미 동일한 기본 키 값이 있으므로 'MyCar'유형의 엔터티를 연결하지 못했습니다. 이것은 'Attach'방법을 사용하거나 그래프의 엔티티 중 하나가 충돌하는 키 값을 갖는 경우 엔티티의 상태를 '변경되지 않음'또는 '수정 됨'으로 설정할 때 발생할 수 있습니다. 이는 일부 엔티티가 새롭고 아직 데이터베이스 생성 키 값을 수신하지 않았기 때문일 수 있습니다. 이 경우 'Add'메소드 또는 'Added'엔티티 상태를 사용하여 그래프를 추적 한 다음 비 신규 엔티티의 상태를 'Unchanged'또는 'Modified'로 적절하게 설정하십시오.

+1

컬렉션을로드하기 전에 엔티티 연결을 시도 했습니까? 예 : 'this.context.Set () .Attach (entity); ' – DavidG

+0

특별한 경우에만 컬렉션을 다시로드하고 싶습니다. 그것이 효과가있다, 내가 전에 그것을 준다면 나는 알고있다. –

+0

죄송합니다, 당신이 무슨 말을하는지 이해가 안됩니다. – DavidG

답변

1

나는 때문에 명시 적로드가 작동하지 않는다고 생각합니다.

명시 적로드를 사용하려면 getbyid 메소드에서 제거해야합니다.

또한 모음과 함께 문자열을 사용할 수 있으므로 func을 첨부하는 대신로드 할 탐색 기능이 두 개 이상인 경우 문자열이나 문자열 목록을 사용할 수 있습니다.

당신이 모음을 사용하여 단일 엔티티 탐색을 위해 당신이 참조 사용한다 또한 수집을 알고 좋은

당신이 당신의 getbyid 문자열 목록에 다른 PARAM을 추가 할 모든 문자열을 포함 할 수있는 가장 좋은 것은 이 목록에는 include도 문자열을 허용하므로

관련 문제