2010-01-06 6 views
4

긴 이야기 짧은 발행 페이지 새로 고침시 웹 사이트에 반영). 캐싱을 끄는 방법이 있습니까? 또는 캐시를 재설정하는 방법 (예 : 현재 데이터베이스에서 데이터를 변경하는 경우 결과를보기 전에 물리적으로 코드를 변경하고 다시 컴파일해야 함).LINQ는

마침내 C# 질문 (제 부분에서 기본적인 실수가있을 수 있습니다). 아래의 코드에서 그때 method1 실행하면 method2 다음 doc2 == doc1 (그리고 나는 그것이 DB에서 원래 값을 얻으려면)이 RecordDictionary 클래스는 그렇게는 직접적인 관련이 없습니다 (데이터를 피벗으로

이 나에게 매우 이상한 것 같다 모델로), 그리고 내 코드에서 할당은 다른 컨트롤러에 있습니다. 하지만 어떻게 든 LINQ는 SQL에 내가 내 응용 프로그램을 종료하고, 내가 doc1을 변경할 때까지 doc2가) (나는 그것이 것으로 기대 동일 컴파일하면 캐싱 변경 (doc2doc1에 적용하고 적용입니다

인위적인 예를

public RecordDictionary method1() 
{ 
    RecordDictionary doc1 = genericRepository.GetRecordById(
     action.AppliesToModelEntityId, 27); 

    //do some stuff to doc1 here 
    return doc1; 
} 

public RecordDictionary method2() 
{  
    RecordDictionary doc2 = genericRepository.GetRecordById(
     action.AppliesToModelEntityId, 27); 
    return doc2; 
} 

public RecordDictionary GetRecordById(int ContainerModelId, int id) 
{ 
    var query = (from dv in _db.DataValues 
       where dv.DataInstance.IsCurrent == true && 
        dv.DataInstance.DataContainer.DataContainerId == id 
       select new { 
        dv.DataInstance.DataContainer.ParentDataContainerId, 
        dv }); 

    RecordDictionary result = CreateRecordColumns(
     ContainerModelId, query.FirstOrDefault().ParentDataContainerId); 
    result.Id = id; 

    foreach (var item in query) 
    { 
     if (result.ContainsKey(item.dv.ModelEntity.ModelEntityId)) 
      result[item.dv.ModelEntity.ModelEntityId] = item.dv;        
    } 

    return result; 
} 
+1

스트레이트 캐쉬 homie. – jason

+0

LINQ to SQL이 캐싱 중임을 어떻게 알 수 있습니까? – Jacob

+1

db로 직접 변경하면 해당 변경 사항이 응용 프로그램에 반영되지 않습니다. –

답변

6

C "작업 단위"당 새로운 DataContext, 즉 HTTP 요청, 또는 심지어 [1] 메쏘드 - 메소드의 끝에서 (또는 구현의 일부로) SubmitChanges가 한번 호출된다.

// Where this is all one (financial) transaction. 
void Transfer(int fromAccountId, int toAccountId, decimal amount) { 
    var db = new Customers(); 
    var fromAccount = db.Accounts.Single(row => row.Id == fromAccountId); 
    var toAccount = db.Accounts.Single(row => row.Id == toAccountId); 
    fromAccount.Balance -= amount; 
    toAccount.Balance += amount; 
    db.SubmitChanges(); 
} 

당신은 또한 당신이 다시 DataContexts 뒤에 변경된 것으로 기대 행에 DataContext.Refresh()를 호출 할 수 있지만, 효율적으로 사용하기는 어렵다. 저장 프로 시저 같은 것을위한 것입니다 :

var client = db.Clients.Single(row => row.Id == clientId); 
if (!client.CheckingAccount) { 
    db.CreateCheckingAccount(client.Id); // Stored procedure. 
    db.Refresh(RefreshMode.OverwriteCurrentValues, client); 
} 
+1

내 데이터 아키텍트 친구와 이야기 해 주셔서 감사합니다. ORM은 ORM을 통해 모든 데이터 변경이 ORM을 통해 발생한다고 가정합니다. db 또는 응용 프로그램에서 ORM을 사용해서는 안됩니다 ... 내 응답은 처음부터 시작한 경우 도전적으로이 프로젝트에서 ORM을 사용하지 않을 것이라고했지만, 베타 테스트, 다시 할 시간이 없다;) –

+0

아! datacontext에 대한 내 선언이 정적이었습니다. 이것이 제가 주된 문제였습니다 (어딘가에서 찾은 일부 코드를 복사했습니다) –

1

는 데이터 컨텍스트 클래스에 true로 설정 ObjectTrackingEnabled되어 있습니까? 당신이 false로 설정을 시도 할 수 있도록합니다. 또한, 유용한 this blog entry를 읽고 찾을 수 있습니다.

+7

주의 :'ObjectTrackingEnabled = false'는'SubmitChanges()'를 비활성화합니다. –

+0

좋은 블로그 항목입니다. 흥미롭게도 나는 저장된 procs를 사용하여 데이터베이스를 업데이트하지만, datacontext를 먼저 업데이트 (그리고 캐쉬)하고 sp를 호출하기 때문에 블로그에 언급 된 문제가 없습니다. ObjectTrackingEnabled를 false로 설정하면 모든 것이 손상됩니다. (assosiations은 더 이상 작동하지 않습니다.) –