在AppPool Recycle之后,实体框架模型不起作用

时间:2013-06-17 03:27:11

标签: asp.net-mvc entity-framework-5

我们正在使用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中强制进行模型重建?

1 个答案:

答案 0 :(得分:1)

事实证明,我确实有一些其他代码,但主要是因为我将我的实体和我的EntityModelConfiguration类分离成单独的项目(我们有太多),有时ASP.NET运行时会加载我的程序集以不同的顺序,有时它还没有加载它们(或根本没有)。所以我在应用程序启动期间使用this answer从我的/ bin文件夹中预加载了所有程序集。