DbContext缓存

时间:2015-12-04 11:22:55

标签: c# entity-framework dbcontext

我知道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的情况下使用。在客户端进行调用。除了单身(反)模式,这会导致什么问题?感谢。

2 个答案:

答案 0 :(得分:13)

DbContext是缓存。长时间保持它是一个可怕的想法......它将慢慢消耗你的应用程序的记忆,这些记忆可能会陈旧。

它不是按照您提议的方式使用的。

不要这样做。

DbContext是一个瞬态对象,应该在尽可能小的范围内使用和处理。

 using(var ctx = new MyDbContext())
 {
      //make some changes
      ctx.SaveChanges();
 }

它是如何设计使用的。正确使用它。

答案 1 :(得分:5)

This is an XY problem为什么你想&#34;缓存&#34; DbContext?你认为从中获益有什么好处?

你不应该这样做。这堂课不是为了这个。它会导致性能问题(撤消您认为获得的好处)和附加无效实体后的持久性错误 - 您将永远无法再次使用此上下文保存实体,因为更改跟踪器保存实体。

查看Correct usage of EF's DBContext in ASP.NET MVC application with Castle WindsorWorking with DbContextManaging DbContext the right way with Entity Framework 6: an in-depth guideManage the lifetime of dbContext或其他数千次点击,搜索网页上的实体框架dbcontext lifetime&#34 ;

如果要缓存数据,请自行缓存记录。现有的解决方案(代码和库)可以帮助您实现这一目标,称为&#34;二级缓存&#34;。不需要自己写。请参阅示例How to make Entity Framework cache some objects