我们使用的是 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 步骤。
我假设实体框架正在构建模型,然后将其发送或保存到某个东西,这就是为什么它不需要调用 ModelCreating。根据这个答案,实体框架(从 4.0 开始)将缓存模型,但仅在同一 AppDomain 中创建新的 DbContext 时才重用它。那么什么会导致模型损坏呢?如何在 Application_OnStart 中强制模型重建?