2012-06-29 3 views
0
원인

나는 전체 테이블 캐시 경우 때문에 세 번째 줄의,캐싱 엔티티는 원치 않는 삽입

var context = new Context(); 
var t2 = new Table2(); 
t2.MyTable1Reference = table1Cache.Single(x=>x.Id == paramIntId); 
context.SaveChanges(); 

새로운 행이 표에 삽입됩니다 : 다음

static List<Table1> table1Cache = context.Table1.ToList(); 

내가 연결하는 데 사용을 . EF는 이것이 새로운 실체라고 생각합니다. 나는 항상 컨텍스트를 만들 때 캐시 첨부 (예 : 요청 당 1 개의 컨텍스트가 있음) 또는 MyTable1ReferenceID = table1Cache.Single (x => x.Id == paramIntId)를 사용하는 것과 같은 일을 할 수 있음을 알고 있습니다.

하지만 안전하지 않을 수도 있습니다. 때로는 잊을 수 있습니다. 좋은 해결책이 있습니까?

답변

0

예, 엔티티가 현재 현재 컨텍스트와 연결되어 있지 않기 때문에 이해가됩니다. 따라서 EF는 그것이 일시적이고 새로운 인스턴스를 저장한다고 생각합니다.

컨텍스트를 캐싱하는 경우 개체 자체를 저장하지 않으려는 경우입니다. 문맥과 관련이있다. 대신 캐시에 데이터를 저장하려고합니다. 기본적으로 엔티티를 직렬화 및 비 직렬화합니다. 또한 현재 컨텍스트가있을 때 엔티티를 연관시켜야하므로 다음에 캐시에서 검색 할 때 캐시와 데이터베이스 모두에 변경 사항을 저장할 수 있습니다.

이 모든 것이 많이 들리면 그렇습니다. 2 개의 데이터 저장소를 동기화 된 상태로 유지하는 것이 쉬운 문제는 아닙니다. 나는 NHibernate를위한 2nd level cache의 구현을 살펴볼 것이다.