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