2009-10-15 3 views
0

데이터베이스에 변경 사항을 인식하지 않습니다 그래서 물어 봐야 :LINQ 내가 비슷한 찾을 수 없습니다

내가 SQL에 LINQ를 사용하고 난 데이터베이스 항목을 업데이트하는 저장 프로 시저를 사용하기 시작할 때까지 모두 잘했다. (My Stored Proc는 groupid x의 모든 항목을 업데이트하는 것과 비슷합니다.) 업데이트가 제대로 실행되고 데이터베이스의 값이 변경됩니다. 그러나 DataContext는이 변경 사항을 무시합니다.

데이터 컨텍스트는 일반적인 방법이 아니라는 것을 알고있는 싱글 톤이지만, 왜 이렇게해야하는지 다른 이유가 있습니다.

그렇게
db.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues); 

도움이되지 않습니다.

왜 DB의 변경 사항을 알지 못합니까?

답변

2

LinqToSql이 작동하는 방식에 대해 당신이하려는 일이 많이 있습니다.

긴 수명의 DataContext를 사용하는 것은 특히 LinqToSql이 데이터 변경 내용을 쉽게 추적 할 수없는 저장 프로 시저를 호출해야 할 경우에 매우 어렵습니다.

DataContext를 통해 변경 한 내용은 일반적으로 자동으로 추적되므로 DataContext는 캐시를 적절히 관리하고 해당 DataContext에서 데이터베이스에 대한 변경 사항을 추적 할 수 있습니다. 그러나 항상 그런 것은 아닙니다. DataContext는 저장 프로 시저가 수행하는 작업을 이해하지 못하므로 쉽게 캐시를 유지하는 방법을 알지 못합니다. 저장 프로 시저를 호출 한 후, DataContext를 제거하고 새 DataContext를 만드는 것이 가장 좋습니다. 이는 효과적으로 성능을 저하시키지 않을 수도있는 캐시를 효과적으로 날려 버리지 만 데이터 무결성이 주요 관심사입니다.

Singleton DataContext가 데이터베이스를 수정하는 유일한 것이 아니라면 (예 : 데이터베이스가 트리거, 일괄 처리, 다른 응용 프로그램 등으로 수정 될 수있는 경우), DataContext는 다음과 같은 부정확 한 데이터를 포함 할 수 있습니다. 그 캐쉬는 아직 수명이 짧은 DataContext를 가지는 또 다른 이유입니다.

그래서 오래 살았던 Singleton DataContext를 사용하여 성공할 수는 있지만 시스템 전체에서 시스템을 다룰 것이며 결국 시스템이 승리 할 것입니다.

다음을 결정해야합니다. 데이터 무결성이 얼마나 중요합니까?

+0

awsome answer! 감사 – Markus

2

datacontext가 값을 캐싱하기 때문입니다. 여기에 대한 도움말은 clear the cache입니다. 그러나 이제는 언제 제거해야하는지 알 수있는 알림 시스템을 구현하는 문제가 있습니다.

데이터 컨텍스트는 단일 작업 단위에서만 사용해야합니다. 싱글 톤 (아마도 )으로 매달아 놓는 것은 좋은 생각이 아닙니다.