2013-05-12 7 views
1

{ "같은 키를 가진 개체가 이미. ObjectStateManager는 동일한 키를 사용하여 여러 개체를 추적 할 수 없습니다. ObjectStateManager에 존재하는"},하지만 같은과 예외를이 코드를

객체를 얻을 수 키가 이미 ObjectStateManager에 있습니다. ObjectStateManager는 동일한 키를 가진 여러 객체를 추적 할 수 없습니다.

else 부분.

public int AddOrUpdateEntity<T>(T entity) where T : class , IEntity 
{ 
    int numberOfobjectsWritten = 0; 

    using (DalContext dbContext = new DalContext()) 
    { 
     //If Id == 0 it means it's a new entity in Db and needs to be added 
     dbContext.Entry<T>(entity).State = entity.Id == 0 ? 
            EntityState.Added : 
            EntityState.Modified; 

     numberOfobjectsWritten = dbContext.SaveChanges(); 
     } 
} 
+0

'entity.Id'가 Identity로 설정되고 자동 증가합니까? – gideon

답변

5

이 예외는 이미 컨텍스트에서 추적 한 동일한 키를 가진 중복 엔터티가 있음을 의미합니다. 각 엔티티는 컨텍스트로 한 번만 추적 할 수 있습니다. 동일한 엔티티 (이미 추적 된 인스턴스와 동일한 키를 가지고 있음)의 다른 인스턴스를 연결하려고하면이 예외가 발생합니다.

즉, 업데이트하려고하는 엔티티의 다른 인스턴스가 컨텍스트에서 이미 추적되고 있음을 의미합니다. 첨부 또는 추가는 항상 객체 그래프 전체에 적용되므로 (탐색 속성을 통해 액세스 된 관련 엔티티에도 적용됨) 문제가있는 엔티티가 반드시 수정하려는 것이 아니라 관계 중 하나 일 필요가 있습니다.

dbContext.ChangeTracker.Entries<T>().FirstOrDefault(e => e.Id == entity.Id)을 사용하여 동일한 키가있는 엔티티 인스턴스가 이미 추적되는지 확인할 수 있습니다.