C# LINQ到SQL缓存问题

C# LINQ到SQL缓存问题,c#,linq-to-sql,caching,C#,Linq To Sql,Caching,长话短说:我正在使用LINQtoSQL,但它的缓存有问题 我的应用程序是元数据驱动的,所以我不希望缓存打开(数据库中的更改应该在页面刷新时反映在网站中)。有没有办法关闭缓存?或者重置缓存的方法(例如,当前当我更改数据库中的数据时,我必须在看到结果之前物理地更改代码并重新编译) 最后是一个c#问题(希望我犯了一个基本的错误)。 在下面的代码中,如果我运行method1然后运行method2然后运行doc2==doc1(我希望它从数据库中获取原始值) 这对我来说似乎很奇怪,因为RecordDicti

长话短说:我正在使用LINQtoSQL,但它的缓存有问题

我的应用程序是元数据驱动的,所以我不希望缓存打开(数据库中的更改应该在页面刷新时反映在网站中)。有没有办法关闭缓存?或者重置缓存的方法(例如,当前当我更改数据库中的数据时,我必须在看到结果之前物理地更改代码并重新编译)

最后是一个c#问题(希望我犯了一个基本的错误)。 在下面的代码中,如果我运行
method1
然后运行
method2
然后运行
doc2==doc1
(我希望它从数据库中获取原始值)

这对我来说似乎很奇怪,因为
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;
} 

在您的数据上下文类上ObjectTrackingEnabled是否设置为true?如果是,您可能希望尝试将其设置为false。此外,您可能会发现读取有用。

为每个“工作单元”创建一个新的DataContext:即HTTP请求,甚至一个方法-目的是在方法结束时调用SubmitChanges一次(或作为实施的一部分)

您还可以对希望在DataContext后面更改的行调用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);
}

您如何知道LINQ to SQL正在缓存?因为如果我直接对数据库进行更改,那么这些更改不会反映回应用程序。请小心:
ObjectTrackingEnabled=false
禁用
SubmitChanges()
。很好的博客条目。有趣的是,我确实使用存储过程来更新我的数据库,但我没有在博客中提到这个问题,因为我首先更新datacontext(以及现金),然后调用sp。当我将ObjectTrackingEnabled设置为false时,一切都会中断(关联似乎不再工作)为此,在与我的数据架构师朋友交谈时,他基本上说ORM的假设是所有数据更改都通过ORM发生,如果任何数据更改直接发生在db上,或者在应用程序中,那么你不应该使用ORM…我的回答是,如果我从零开始,我坚决不会在这个项目中使用ORMr由于我离Beta测试还有一周的时间,我真的没有时间重做;)啊!我对datacontext的声明是静态的,这就是导致我的主要问题的原因(我复制了我在某处找到的一些代码)
var client = db.Clients.Single(row => row.Id == clientId);
if (!client.CheckingAccount) {
    db.CreateCheckingAccount(client.Id); // Stored procedure.
    db.Refresh(RefreshMode.OverwriteCurrentValues, client);
}