背景
我有一个中央数据库,我的MVC EF网络应用程序与以下最佳实践交互。这是违规代码:
// GET: HomePage
public ActionResult Index()
{
using (var db = new MyDbContext())
{
return View(new CustomViewModel()
{
ListOfStuff = db.TableOfStuff
.Where(x => x.Approved)
.OrderBy(x => x.Title)
.ToList()
});
}
}
我还在Web应用程序外部手动修改此数据库表中的数据。
我没有保留DbContext
的实例,而不是获取所需数据所需的时间。每个请求构建一个新的。
问题
我遇到的问题是,如果我在网络应用程序外部手动删除行或修改此表中的任何数据,则上述代码提供的数据不会反映这些更改。
通过上述代码获取数据的这些手动编辑的唯一方法是重新启动Web应用程序,或使用Web应用程序对调用SaveChanges
的数据库进行修改。
记录结果
在记录正在执行的查询并进行一些手动测试之后,生成的查询没有任何问题会导致返回错误的数据。
但是,在日志记录中,我在查询完成时间中看到了一个令人困惑的行。关于应用启动的第一个查询:
-- Completed in 86 ms with result: CachingReader
然后任何后续查询都有以下完成时间:
-- Completed in 0 ms with result: CachingReader
这是CachingReader
是什么以及如何禁用此功能?
答案 0 :(得分:0)
<强>元凶强>
我发现错误是在我的网络应用中的其他位置引入的,因为它取代了基础DbProviderServices
以提供缓存,更具体地说,我使用MVCForum使用EF Cache。
此论坛的CachingConfiguration
使用默认的CachingPolicy
来缓存所有内容,除非通过EF进行交互,这是我观察到的确切行为。 More Info
<强>解决方案强>
我提供了自己的自定义CachingPolicy
,它不允许在不希望出现此行为的实体上进行缓存。
public class CustomCachingPolicy : CachingPolicy
{
protected override bool CanBeCached(ReadOnlyCollection<EntitySetBase> affectedEntitySets, string sql, IEnumerable<KeyValuePair<string, object>> parameters)
{
foreach (var entitySet in affectedEntitySets)
{
var table = entitySet.Name.ToLower();
if (table.StartsWith("si_") ||
table.StartsWith("dft_") ||
table.StartsWith("tt_"))
return false;
}
return base.CanBeCached(affectedEntitySets, sql, parameters);
}
}
有了这个,数据库记录现在总是显示:
-- Completed in 86 ms with result: SqlDataReader
谢谢大家!