我们正在使用Entity Framework 5.0版。这些类是从Model-First创建的,但现在是代码优先的。例子:
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类。这是通过逆向工程我的数据库(Schema-First?Database-First?)为我创建的。
因此,数据库存在,模式已填充,我们未使用任何EF迁移或初始化程序。
Database.SetInitializer<DataContext>(null);
问题
当我们的应用程序启动时,一切都加载并初始化就好了。我在Application_OnStart中进行数据库查询只是为了确保它能够正常工作。但是,在运行24小时之后的某个时刻,在应用程序池回收之后,应用程序停止工作。重新启动IIS,回收应用程序池,甚至重新启动计算机都没有任何效果。我得到的错误是:
实体TypeName不是当前上下文的模型的一部分。
这不太好。它刚刚开始工作。但是,我所做的一切都无法让它再次发挥作用。 EXCEPT 上传新的二进制文件或更改/ bin文件夹。这会导致某些内容重置,以便Entity Framework确信可以重建模型。在跟踪代码并查看我的日志时,似乎Entity Framework以某种方式“忘记”了数据库模型,并且在应用程序重新启动时只是跳过 ModelCreating步骤。
我假设实体框架正在构建模型,然后将其发送或保存到某些内容,这就是为什么它不需要调用ModelCreating。根据{{3}},实体框架(从4.0开始)将缓存模型,但仅在同一AppDomain中创建新的DbContext时重用它。那么什么可能导致模型被破坏?如何在Application_OnStart中强制进行模型重建?
答案 0 :(得分:1)
事实证明,我确实有一些其他代码,但主要是因为我将我的实体和我的EntityModelConfiguration类分离成单独的项目(我们有太多),有时ASP.NET运行时会加载我的程序集以不同的顺序,有时它还没有加载它们(或根本没有)。所以我在应用程序启动期间使用this answer从我的/ bin文件夹中预加载了所有程序集。