4

세입자로 분리 된 응용 프로그램과 함께 Entity Framework 6을 사용하고 있습니다. 나는 요청 호스트 이름을보고 세입자를 결정한 다음 응용 프로그램 전체에서 그것을 사용하고 세입자 소유 기록 등으로 설정합니다.엔티티 프레임 워크 - 여러 컨텍스트에 걸쳐 메모리에 개체 캐싱

모든 컨텍스트는 요청이 끝날 때 처리됩니다. 그러나 세입자 조회가 빈번하기 때문에 실제로 호스트 이름 당 한 번만 수행 한 다음 객체를 메모리의 읽기 전용 사전에 저장합니다.

문제는 아무 것도하지 않으면 요청이있는만큼 많은 중복 된 테넌트 기록으로 끝납니다 (어쨌든 지금 모호한 쿼리 때문에 문제가 시작될 때까지).

처음에는 데이터 저장소의 생성자에서 DbSet.Attach() 호출을 추가하고 현재 테넌트를 연결하여이 문제를 해결했습니다. 그러나 동시에 여러 요청이있는 경우 여러 컨텍스트에 동일한 개체를 연결할 수 없다는 예외가 발생합니다. "IEntityChangeTracker의 여러 인스턴스에서 엔터티 개체를 참조 할 수 없습니다." 가끔씩 페이지를 너무 빨리 방문하여 내 컴퓨터에서이 작업을 실행하기 때문에 작업에 적합하다고 상상할 수 없습니다.

내가 대신 저장하기 전에이 호출을 추가하여 일을 변경 시도 :

Context.ChangeTracker.Entries<Tenant>().Single().State = EntityState.Unchanged; 

글쎄, 중 하나가 작동하지 않습니다. "서로 다른 ObjectContext 객체에 첨부되어 있기 때문에 두 객체 간의 관계를 정의 할 수 없습니다."라는 오류 메시지가 나타납니다.

OK ... 그래서 어떻게 합니까 나는 이것을합니까? 내가하려는 것은 (최종 SQL 결과 측면에서) 기존 테넌트 행 PK에 대한 외래 키 참조가있는 여러 행으로 끝납니다.

EF4를 참조하는 일부 항목은 Detach 메서드를 제안했지만, 이제는 DbSet의 공용 인터페이스에서 숨겨져 있기 때문에 더 이상 호출하지 않으려 고합니다. 내가 누군지 모르겠다. 내가 처음 레코드를 가져 왔을 때?

편집 : 작동하는 것으로 보이는 옵션 중 하나는 컨텍스트로 이동하여 캐시 된 레코드의 ID를 기반으로 테넌트 레코드를 추출하는 것입니다. 그러나 지금은 아무런 이유없이 데이터베이스를 쿼리하고 있습니다.

답변

0

그것의 정말 만족하지만, 궁극적으로 내가이 작업을 수행 할 수있는 방법은 외래 키이었다 속성을 포함하는 내 엔티티를 변경 아니었다 : 나는 자유롭게에서 TenantId 필드를 설정할 수 있습니다 다음

[Required] 
public Guid TenantId { get; set; } 

[ForeignKey("TenantId")] 
public virtual Tenant Tenant { get; set; } 

을 캐시 (이 값은 EF로 생성 된 프록시 클래스가 아닌 값 유형이므로)이 문제에 대해 걱정하지 않아도됩니다.

2

데이터의 비 변경 추적, 비 엔티티 관점을 캐시하는 것이 더 합리적 일 수 있습니다. 임차인 기록이 외래 키 관계에 대한 "포인터"인 것 같습니다.

  • 내가 세입자 정보를 캐시 한 않는 다음과 같이 나에게

    논리는? 아니 .. 그것을 얻을 가서

  • 가 지금은
    • 엔티티 문맥을 이동하려면 캐시 키 관계를 사용하는 세입자와 관련된 어떤 쿼리 필요를 캐시
    • 실제로 임차인 기록, 단지 .Include를 (필요한 경우 당신은 단지 하나 이상의 호스트 이름에 매핑되는 세입자 ID를 유지해야처럼 쿼리 대부분의 경우

에 "임차인")는 것 같습니다. 구식 ADO 접근 방식을 사용하고 캐시에서 엔티티를 제거하고 필요한 POCO 데이터를 캐시하십시오.