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
、一度に 1 つずつ tTableName クラスをオーバーライドして渡しました。これはすべて、データベースのリバース エンジニアリング (スキーマ ファースト? データベース ファースト?) によって作成されました。
したがって、データベースが存在し、スキーマが作成され、EF 移行または初期化子を使用していません。
Database.SetInitializer<DataContext>(null);
問題
アプリケーションが起動すると、すべてが正常にロードおよび初期化されます。Application_OnStart でデータベース クエリを実行して、それが機能することを確認します。しかし、アプリケーション プールのリサイクル後、24 時間正常に実行された後、アプリケーションが動作を停止します。IIS の再起動、アプリケーション プールのリサイクル、マシンの再起動でも効果はありません。私が得るエラーは次のとおりです。
エンティティ TypeName は、現在のコンテキストのモデルの一部ではありません。
これはあまりよろしくない。少し前に動作しました。しかし、私が何をしても、それを再び機能させることはできません。新しいバイナリをアップロードするか、/bin フォルダーに変更を加える場合を除きます。これにより何かがリセットされ、Entity Framework がモデルを再構築するようになります。コードをトレースしてログを確認すると、Entity Framework が何らかの理由でデータベース モデルを「忘れて」しまい、アプリケーションの再起動時に ModelCreating ステップをスキップしているように見えます。
私は、Entity Framework がモデルを構築し、それを出力または何かに保存していると想定しています。そのため、ModelCreating を呼び出す必要はありません。この回答によると、Entity Framework (4.0 以降) はモデルをキャッシュしますが、同じ AppDomain 内に新しい DbContext を作成するときにのみ再利用します。では、モデルが破損する原因は何でしょうか? Application_OnStart でモデルの再構築を強制するにはどうすればよいですか?