我知道DbContext的缓存不是个好主意。但我想做的很好。你觉得这条路怎么样?
public class Context : DbContext
{
private Context()
{
}
private static WeakReference<Context> _cachedContext;
public Context Instance
{
get
{
Context context;
if (!_cachedContext.TryGetTarget(out context))
{
context = new Context();
_cachedContext.SetTarget(context);
}
return context;
}
}
}此代码计划在客户端不使用IDisposable.Dispose调用。除了单例(反)模式之外,这会引起什么问题?谢谢。
发布于 2015-12-04 11:26:05
DbContext是一个缓存。坚持很长时间是个糟糕的主意.它将慢慢地消耗应用程序的内存,保存那些很可能已经过时的数据。
它不是按照你提议的方式设计的。
不要这么做。
DbContext是一个瞬态对象,应该在尽可能小的范围内使用和处理。
using(var ctx = new MyDbContext())
{
//make some changes
ctx.SaveChanges();
}它就是这样设计出来的。好好利用它。
发布于 2015-12-04 11:26:20
这是一个XY问题。为什么想要“缓存”DbContext?你觉得你能从中得到什么好处?
你永远都不该这么做。这门课不是用来做这个的。相反,它将导致性能问题(取消您认为可以获得的好处)和附加无效实体之后的持续错误--您将再也无法使用此上下文保存实体,因为更改跟踪器保存实体。
请参阅城堡温莎在ASP.NET MVC应用程序中正确使用EF的ASP.NET、使用DbContext、使用实体框架6正确地管理DbContext :深度指南、管理dbContext的生存期或其他数千次搜索web中的“实体框架dbcontext生存期”。
如果您想要缓存数据,那么应该缓存记录本身。有一些现有的解决方案(代码和库)可以帮助您这样做,这就是所谓的“二级缓存”。不用自己写。例如,参见如何使实体框架缓存某些对象。
https://stackoverflow.com/questions/34087243
复制相似问题