세입자로 분리 된 응용 프로그램과 함께 Entity Framework 6을 사용하고 있습니다. 나는 요청 호스트 이름을보고 세입자를 결정한 다음 응용 프로그램 전체에서 그것을 사용하고 세입자 소유 기록 등으로 설정합니다.엔티티 프레임 워크 - 여러 컨텍스트에 걸쳐 메모리에 개체 캐싱
모든 컨텍스트는 요청이 끝날 때 처리됩니다. 그러나 세입자 조회가 빈번하기 때문에 실제로 호스트 이름 당 한 번만 수행 한 다음 객체를 메모리의 읽기 전용 사전에 저장합니다.
문제는 아무 것도하지 않으면 요청이있는만큼 많은 중복 된 테넌트 기록으로 끝납니다 (어쨌든 지금 모호한 쿼리 때문에 문제가 시작될 때까지).
처음에는 데이터 저장소의 생성자에서 DbSet.Attach() 호출을 추가하고 현재 테넌트를 연결하여이 문제를 해결했습니다. 그러나 동시에 여러 요청이있는 경우 여러 컨텍스트에 동일한 개체를 연결할 수 없다는 예외가 발생합니다. "IEntityChangeTracker의 여러 인스턴스에서 엔터티 개체를 참조 할 수 없습니다." 가끔씩 페이지를 너무 빨리 방문하여 내 컴퓨터에서이 작업을 실행하기 때문에 작업에 적합하다고 상상할 수 없습니다.
내가 대신 저장하기 전에이 호출을 추가하여 일을 변경 시도 :Context.ChangeTracker.Entries<Tenant>().Single().State = EntityState.Unchanged;
글쎄, 중 하나가 작동하지 않습니다. "서로 다른 ObjectContext 객체에 첨부되어 있기 때문에 두 객체 간의 관계를 정의 할 수 없습니다."라는 오류 메시지가 나타납니다.
OK ... 그래서 어떻게 합니까 나는 이것을합니까? 내가하려는 것은 (최종 SQL 결과 측면에서) 기존 테넌트 행 PK에 대한 외래 키 참조가있는 여러 행으로 끝납니다.
EF4를 참조하는 일부 항목은 Detach 메서드를 제안했지만, 이제는 DbSet의 공용 인터페이스에서 숨겨져 있기 때문에 더 이상 호출하지 않으려 고합니다. 내가 누군지 모르겠다. 내가 처음 레코드를 가져 왔을 때?
편집 : 작동하는 것으로 보이는 옵션 중 하나는 컨텍스트로 이동하여 캐시 된 레코드의 ID를 기반으로 테넌트 레코드를 추출하는 것입니다. 그러나 지금은 아무런 이유없이 데이터베이스를 쿼리하고 있습니다.