2008-11-11 3 views
1

LINQ to Entities를 사용하면 데이터베이스에 대해 쿼리하고 수정할 수있는 실제 CLR 개체를 얻을 수있는 좋은 방법입니다. 데이터는 데이터를 바인딩하는 등의 작업을합니다. 그러나 두 번째 동일한 쿼리를 수행하면 동일한 CLR 개체 또는 완전히 새로운 집합에 대한 참조가 반환됩니까?LINQ to Entities는 개체의 인스턴스를 다시 사용합니까?

동일한 실제 데이터의 사본 수가 계속 증가하는 쿼리를 생성하지 않으려합니다. 여기서 문제는 하나의 엔티티의 내용을 변경하여 데이터베이스에 다시 저장할 수 있지만 엔티티의 다른 인스턴스는 여전히 다른 곳에 있으며 이전 데이터를 보유하고 있다는 것입니다.

답변

1

동일한 DataContext 내에서 투영 대신 전체 객체를 반환하는 쿼리의 경우 항상 동일한 객체를 얻게됩니다.

그러나 다른 DataContext는 다른 객체를 가져 오므로 거기에 오래된 데이터가 표시 될 위험이 있습니다.

1

동일한 DataContext에서 쿼리 된 경우 동일한 개체가 생성됩니다 (DataContext는 내부 캐시를 유지 관리합니다).

거래하는 오브젝트는 대체로 변경 가능하므로 하나의 문제점 (데이터 중복) 대신 다른 (동시 액세스)을 얻을 수 있다는 점에 유의하십시오.

비즈니스 사례에 따라 오래된 데이터가있는 두 번째 트랜잭션이 커밋에 실패하게 할 수 있습니다.

또한 좋은 이전 IDataReader/DataSet 시나리오를 상상해보십시오. 두 개의 쿼리는 서로 다른 데이터 집합을 채울 두 개의 서로 다른 독자를 반환합니다. 따라서 데이터 중복 문제는 ORM과 관련이 없습니다.

0

[oops; 이 회신은 Entity Framework가 아닌 Linq-to-SQL에 적용됨을 유의하십시오.

부분적으로 주제이므로 유용 할 수도 있으므로 삭제하지 말고 여기에 두었습니다. 또한 다른 답변에


는 데이터 컨텍스트는 쿼리 "기본 키에 의해"단순히위한 왕복을하고 피할 수있는 능력을 가지고 있습니다 - 처음 캐시를 확인합니다.

불행히도, completely3.5 깨진 있었고, 3.5SP1 여전히 half-broken이지만, 일부 쿼리 작동합니다. 이렇게하면 개별 개체를 얻는 데 많은 시간을 절약 할 수 있습니다.

// uses object identity cache (IIRC) 
var obj = ctx.Single(x=>x.Id == id); 

하지만하지 :

// causes round-trip (IIRC) 
var obj = ctx.Where(x=>x.Id == id).Single(); 

그래서 기본적으로 IIRC 당신은 사용할 필요가

관련 문제