Entity Framework を使い始めていますが、コードファースト アプローチの重要なポイントを見逃しているかどうかわかりません。
私は以下のコードに基づいた汎用リポジトリパターンを使用しています。https://genericunitofworkandrepositories.codeplex.com/そして私のエンティティを作成しました。
しかし、エンティティにアクセスしたり変更したりしようとすると、次のような問題が発生します。
System.InvalidOperationException: エンティティ タイプ Estate は、現在のコンテキストのモデルの一部ではありません。
リポジトリからアクセスしようとしたときに発生します:
public virtual void Insert(TEntity entity)
{
((IObjectState)entity).ObjectState = ObjectState.Added;
_dbSet.Attach(entity); // <-- The error occurs here
_context.SyncObjectState(entity);
}
データベース (./SQLEXPRESS) は正常に作成されますが、起動時にエンティティ (テーブル) が作成されません。
エンティティのマッピングを明示的に設定する必要があるかどうか疑問に思っています。EF では独自にこれを行うことはできないのでしょうか?
私のエンティティは次のとおりです:
public class Estate : EntityBase
{
public int EstateId { get; set; }
public string Name { get; set; }
}
私の状況は次の通りです:
public partial class DimensionWebDbContext : DbContextBase // DbContextBase inherits DbContext
{
public DimensionWebDbContext() :
base("DimensionWebContext")
{
Database.SetInitializer<DimensionWebDbContext>(new CreateDatabaseIfNotExists<DimensionWebDbContext>());
Configuration.ProxyCreationEnabled = false;
}
public new IDbSet<T> Set<T>() where T : class
{
return base.Set<T>();
}
}
このエラーが発生する特定の理由はありますか? 移行を有効にしたり、自動移行を有効にしたりしてみましたが、どちらも役に立ちませんでした。
ベストアンサー1
これをカスタムDbContext
クラスに追加します。
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Estate>().ToTable("Estate");
}
起動時にテーブルが作成されない場合は、これが原因です。OnModelCreating メソッドのオーバーライドで、DbContext にテーブルについて通知する必要があります。
ここでエンティティごとのカスタム マッピングを実行するか、それらを別々のEntityTypeConfiguration<T>
クラスに分離することができます。