2017-01-24 2 views
0

문제가 발생했습니다. 이유가 무엇인지 알고 있지만 문제를 해결하는 올바른 방법을 모릅니다.엔티티 프레임 워크 : IEntityChangeTracker의 여러 인스턴스에서 개체를 참조 할 수 없습니다.

내 컨트롤러가 객체를 정의하는 2 개의 문자열과 함께 제품을 내 Service 클래스로 보냅니다.

다음은 서비스 클래스입니다.

public Product AddProduct(Product p, string cat, string subcat) 
{ 
    var category = _categoryService.GetCategoryByName(cat, subcat); 
    p.Categories.Add(category); 
    return _productRepository.CreateProduct(p); 
} 

첫 번째 줄의 리스팅 그래서 여기에 내가 내 컨텍스트의 인스턴스를 사용 소재 기존 카테고리 (CategroyService-> CategoryRepository-> DbContext)입니다.

그런 다음 해당 카테고리를 제품 카테고리 목록에 추가합니다. 그리고 마침내 나는 저장소에주고 그것을 내 데이터베이스 (eflow of the course)에 보관합니다.

은 그 때 나는 오류를 얻을

An entity object cannot be referenced by multiple instances of IEntityChangeTracker. 

내가 먼저 카테고리를 요청하고 제품을 추가하려고 있기 때문에 생각합니다. 그런 다음 변경 추적 프로그램은 2 개의 컨텍스트를 추적해야하며 혼동을 야기합니다. 문제는 내가 카테고리를 가질 때 카테고리의 첫 번째 컨텍스트가 삭제되지 않는 이유를 얻지 못한다는 것입니다.

어떻게해야합니까?

편집 :

_categoryService는 ProductRepository 이상의 다른 저장소를 사용한다.

답변

1

이미 언급 한 것처럼 하나의 요청 (작업 단위)에서 더 많은 DbContext 인스턴스를 사용하는 것이 문제입니다.

웹 응용 프로그램을 개발할 때 가장 좋은 방법은 모든 웹 요청에 대해 다른 인스턴스의 DbContext를 사용하는 것이지만 필요한 모든 변경을 한 경우에만 1 회의 요청에 대해 exaclty 1 인스턴스를 호출하고 SaveChanges를 한 번만 호출하는 것입니다.

Unity와 같은 IoC 프레임 워크를 사용하고 리포지토리에 DbContext를 삽입하면 매우 쉽습니다. 이 경우 다음과 같은 설정을 사용해야에서

(당신이 사용하는 경우 유니티) :

container.RegisterType<DbContext, YourDbContext>(new PerRequestLifetimeManager(), ...); 
+0

감사합니다! 나는 이미 몇 가지 책임을 바꿨는데, 실제로 상황을 한 번만 호출하고 한 번만 저장했습니다. – TanguyB