1. ホーム
  2. c#

[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。

2022-01-28 21:19:23

質問

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単体ではできないのでしょうか?

私のEntityは

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>();
    }

}

このエラーが発生する具体的な理由はありますか?移行を有効にしたり、自動移行を有効にしたりしてみましたが、どちらもうまくいきません。

解決方法を教えてください。

これをカスタム DbContext クラスがあります。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Estate>().ToTable("Estate");
}

起動時にテーブルが作成されない場合は、このためです。OnModelCreating メソッドのオーバーライドで、DbContext にそれらのことを伝える必要があります。

ここでエンティティごとのカスタムマッピングを行うこともできますし、エンティティごとに別々の EntityTypeConfiguration<T> クラスがあります。