2010-01-06 106 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