【发布时间】: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