2010-01-06 111 views
4

長話短說:我使用LINQ到SQL,但LINQ到SQL高速緩存的問題

我的應用程序元數據驅動的因與它的緩存問題,所以我不希望在高速緩存(在DB的變化應該是反映在網頁上刷新頁面)。有沒有辦法關閉緩存?或者重置緩存的方法(例如,當我更改數據庫中的數據時,我必須在看到結果之前在物理上更改代碼並重新編譯)。

最後一個C#的問題(希望我的一個基本錯誤)。 在下面的代碼,如果我跑method1然後method2然後doc2 == doc1(我希望它從DB獲得原始值)

RecordDictionary類轉動數據(所以並不直接涉及這似乎很奇怪,我到模型),並在我的代碼中分配在不同的控制器;但不知何故,LINQ to SQL是應用緩存更改doc1並將它們應用到doc2(如果我退出了我的應用程序,並重新編譯然後doc2等於什麼,我希望它是(直到我改變doc1

人爲的例子

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

Straight cache homie。 – jason 2010-01-06 04:51:41

+0

你怎麼知道LINQ to SQL緩存? – Jacob 2010-01-06 05:00:54

+1

因爲如果我直接對db進行更改,那麼這些更改不會反映迴應用程序。 – 2010-01-06 20:03:26

回答

6

ç爲每個「工作單元」重新創建一個新的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 ...我的迴應是,我敢肯定不會在這個項目中使用ORM,如果我從頭開始,但是因爲我離開了一週Beta測試,我沒有時間重做;) – 2010-01-06 20:09:29

+0

啊! 我對datacontext的聲明是靜態的,這是我的主要問題(我複製了一些我在某處找到的代碼) – 2010-01-06 20:55:36

1

是ObjectTrackingEnabled設置爲true,您的數據上下文類?如果是這樣,你可能想嘗試將其設置爲false。此外,您可能會發現閱讀this blog entry有用。

+7

小心:'ObjectTrackingEnabled = false'禁用'SubmitChanges()'。 – 2010-01-06 07:14:59

+0

好博客條目。有趣的是,我使用存儲過程來更新我的數據庫,但是我沒有在博客中提到的問題,因爲我首先更新了datacontext(從而更新了cashe),然後調用了sp。當我將ObjectTrackingEnabled設置爲false時,所有內容都會中斷(協同似乎不再工作) – 2010-01-06 20:42:52