【发布时间】:2013-06-17 03:27:10
【问题描述】:
我们使用的是 Entity Framework 5.0 版。这些类是从模型优先创建的,但现在是代码优先的。例子:
public class tTableName: EntityTypeConfiguration<EntityName> {
public tTableName() {
// Primary Key
this.HasKey(t => t.ID);
// Properties
this.Property(t => t.Column2)
.IsRequired()
.HasMaxLength(255);
this.Property(t => t.Column5)
.HasMaxLength(5);
// Table & Column Mappings
this.ToTable("tTableName");
this.Property(t => t.ID).HasColumnName("ID");
this.Property(t => t.Column2).HasColumnName("Column2");
this.Property(t => t.Column3).HasColumnName("Column3");
this.Property(t => t.Column4).HasColumnName("Column4");
this.Property(t => t.Column5).HasColumnName("Column5");
this.Property(t => t.Column6).HasColumnName("Column6");
}
}
public class EntityName{
public int ID { get; set; }
public string Column2{ get; set; }
public string Column3 { get; set; }
public DateTime? Column4 { get; set; }
public string Column5 { get; set; }
public int? Column6 { get; set; }
}
在我的 DataContext 类中,我已覆盖 OnModelCreating 并一次传入一个 tTableName 类。这一切都是通过对我的数据库进行逆向工程(架构优先?数据库优先?)为我创建的。
因此,数据库存在,架构已填充,并且我们没有使用任何 EF 迁移或初始化程序。
Database.SetInitializer<DataContext>(null);
问题
当我们的应用程序启动时,一切都正常加载和初始化。我在 Application_OnStart 中进行了数据库查询,以确保它确实有效。但是,在运行良好 24 小时后的某个时间点,在应用程序池回收之后,应用程序停止工作。重启IIS,回收App Pool,甚至重启机器都没有效果。我得到的错误是:
实体 TypeName 不是当前上下文模型的一部分。
这不是很好。它在片刻之前起作用了。但我所做的一切都无法让它再次工作。 除了上传新的二进制文件或更改 /bin 文件夹。这会导致某些东西被重置,以便说服 Entity Framework 重新构建模型。在跟踪代码并查看我的日志时,Entity Framework 似乎以某种方式“忘记”了数据库模型,并且只是在应用程序重新启动时跳过 ModelCreating 步骤。
我假设 Entity Framework 正在构建模型,然后将其发送或保存到 something,这就是它觉得不需要调用 ModelCreating 的原因。根据this answer,Entity Framework(从 4.0 开始)将缓存模型,但仅在同一 AppDomain 中创建新的 DbContext 时才重用它。那么什么会导致模型损坏呢?如何在 Application_OnStart 中强制模型重建?
【问题讨论】:
标签: asp.net-mvc entity-framework-5