【问题标题】:Weird Caching Issue EF Code First Application SQL Server 2014奇怪的缓存问题 EF Code First 应用程序 SQL Server 2014
【发布时间】:2016-05-24 15:38:33
【问题描述】:

我正在使用 EF 代码在 .Net MVC 中开发一个基本的 CRUD 应用程序。

我遇到了一个以前从未真正遇到过的问题。

基本上,我对数据库后端所做的任何更改都不会反映在应用程序中,除非我在服务器上重新启动网站或重新部署应用程序。

我正在开发另一个应用程序,它有完全相同的问题。

我使用该应用程序所做的任何更改都很好,但对 SQL 后端的任何手动更新都没有得到通过。

我很确定它不在客户端我已经进行了硬刷新,手动清除了我的所有浏览数据并在我的浏览器上安装了缓存杀手。

有什么想法可以开始调试这个问题吗?

谢谢

这是我的数据库上下文文件的样子:

 public partial class MyContext: DbContext
    {

        public MyContext() : base("name=MyContext")
        {

        }

        public DbSet<MyDbSet> MyDbsets { get; set; }
        etc...


        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }

我在我的 MVC 层中使用 unity 调用它:

 private static IUnityContainer BuildUnityContainer()
        {
            var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers

            // e.g. container.RegisterType<ITestService, TestService>(); 

            // repos
            ...my repos

            // service
           ... my serives


            container.RegisterType<MyContext>(new HierarchicalLifetimeManager());

            RegisterTypes(container);

            return container;
        }

我已经以这种方式设置了几十个应用程序,从来没有遇到过这个问题..也不明白反对票..这是一个真正的问题

【问题讨论】:

  • 您如何管理您的实体集?您是在适当地打开/关闭/处置您的 DbContext,还是尝试使用某种静态 DbContext 或单例模式来进行数据访问?你们有可重复的样品吗?
  • 我的数据访问层中有我的 DbContext 文件,并使用 unity 在我的 MVC 层中注册它,如下所示:container.RegisterType(new HierarchicalLifetimeManager());
  • 使用HierarchicalLifetimeManager 意味着返回的上下文实例与容器(每个会话)具有相同的生命周期。如果您总是在每个会话中使用相同的容器实例,您将继续重复使用相同的上下文实例,这是不推荐的。您应该始终为每个“逻辑工作单元”创建一个新的上下文实例,然后将其处理掉。具有长生命周期的上下文可能会表现出非常奇怪的行为。
  • @BradleyUffner 非常正确 HierarchicalLifetimeManager 使用错误 - 更改为 PerRequestLifetimeManager 一切都很好!感谢您的指点,不知道我为什么首先使用它。
  • 我将根据我的评论添加一个答案,因为它解决了您的问题。

标签: c# sql-server asp.net-mvc entity-framework code-first


【解决方案1】:

使用HierarchicalLifetimeManager 意味着返回的context 实例与容器(每个会话)具有相同的生命周期。如果您始终在每个会话中使用相同的容器实例,您将继续重复使用相同的 context 实例,不建议这样做。您应该始终为每个“逻辑工作单元”创建一个新的 context 实例,然后将其处理掉。具有长生命周期的上下文可能会表现出非常奇怪的行为(通常表现为“缓存”)和较差的性能。

PerRequestLifetimeManager 将在您每次请求时返回一个新的 context 实例,这将负责重复使用相同的 context 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    相关资源
    最近更新 更多