1

我们使用的是 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 中强制模型重建?

4

1 回答 1

1

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

于 2013-06-17T21:57:17.143 回答