2009-05-31 3 views
2

나는 이상하게 생각한다. (틀렸다면 나에게 맞춰라.) 버그/Linq에서 SQL을 혼란스럽게하고 나에게 무슨 일이 일어나고 있는지 이해하려고한다.Linq to SQL 이상한 캐싱?

그래서 해결책을 찾기 위해 모든 절차를 절차 적으로 수행했으며 지금까지 해결할 수 없었습니다. 데이터베이스 테이블 "ETickets"을 만들어

  1. 기록 변화 :

    여기에 무슨 일이 일어나고 있는지의 생식입니다. 변경된 항목 "가용성"9 8에서 (아래 참조) ETickets 테이블에 ASP 리피터 바인딩을 보유 Change made to database http://www.composeandshoot.com/soverflow/changemadetodb.jpg

  2. 페이지 새로 고침. 여전히 "9"가 표시됩니다. quickwatch http://www.composeandshoot.com/soverflow/linqtosqlquickwatch.jpg

  3. 그래서 나는 다음 SQL 서버에서 실행되는 쿼리를 살펴했다 :

  4. (아래 참조) 데이터베이스에서 반환 된 어떤 값을 확인하기 위해 데이터 바인딩에 대한 간략한 바라 보았다. SQL Server 프로파일 러를 해고하고있어 다음 (아래 참조).. 는 SQL profiler http://www.composeandshoot.com/soverflow/linqquery.jpg

  5. 쿼리를 실행

    간부 sp_executesql을 N'SELECT [T0] [ID], [T0] [이벤트 ID], [ [id0] = @ p0 ', N'@ p0 uniqueidentifier ', @ p0 [0120] 0 [p0] [0] = '2642C0EF-C0C5-4881-9AC8-53C023B444D2'

  6. SQL Server는 가용성으로 "8"을 반환합니다! 그러나 데이터 바인딩에는 여전히 "9"가 표시됩니다. SQL 캐시 의존성을 활성화하지 않았습니다.

여기 누군가 올바른 방향으로 나를 가리킬 수 있습니까? 감사.

+0

(의견에 회신) –

답변

2

데이터 컨텍스트의 수명주기 란 무엇입니까? 동일한 데이터 컨텍스트입니까, 아니면 매번 새로운 컨텍스트입니까? (아마 후자이어야한다).

데이터 컨텍스트를 다시 사용하는 경우 동일한 신원으로 보일 때 항상과 동일한 객체 을 반환해야합니다. 따라서 이전에 9 버전을 제공했다면 기본 데이터가 변경 되더라도 해당 참조를 계속 제공합니다.

현재로서는 여전히 왕복 여행을하고 있습니다. 왕복을 방지하기 위해, 당신은 사용할 필요가 : 이미 지역 정체성 캐시에 Id == id와 객체가있는 경우

var obj = ctx.SomeTable.Single(x=>x.Id == id); 

즉, 그것은 전혀 databae 쿼리를 수행하지 않습니다.

다른 구조는 왕복을 수행합니다. 이있는 fix in 4.0, .Where(x=>x.Id == id).Single() 쿼리 구문이 있어야 왕복을 방지 할 수 있도록 즉

var obj = (from x in ctx.SomeTable 
      where x.Id == id 
      select x).Single(); 
+0

내가 IQueryable 메서드를 공개 할 부분 클래스를 만들었습니다. 이것은 동일한 datacontext를 사용하고 있었으며 여러분이 말한 것처럼 똑같은 객체를 반환 할 것입니다. 이제는 페이지 자체와 작업에서 datacontext의 새로운 인스턴스를 만들었습니다. 호기심에서 벗어나 내 첫 번째 접근 방식이 실현 가능합니까? - 모든 응용 프로그램에서 쉽게 업데이트 할 수 있도록 모든 메서드를 부분 클래스로 제한하는 것이 좋습니다. 매우 감사합니다. – Robsimm

+0

* 페이지 사이에 데이터 컨텍스트 *를 다시 사용하는 경우 스레딩 및 잠금에 큰 문제가 발생할 것입니다. 신원 추적 + 변경 추적은 천천히 모든 것을 막을 것임을 의미합니다. 간단히 말해서; 데이터 컨텍스트는 수명이 짧고 지역화되어 있어야합니다. –

1

당신이 나중에 쿼리의 하나가 살아있는 동안 하나 DataContenxt를 사용하여 업데이트하고 있습니까?

예인 경우 응답해야합니다.

업데이트 또는 업데이트 후에 새 DataContenxt를 만들고 동일한 DataContext에서 읽기가 완료되면 올바른 응답을 얻을 수 있습니다.