0

缶に書かれているように、Entity Framework 5.0 POCOコンテキストとして使用するのに適したDbContextのインスタンスを作成することは可能ですか?

public DbSet<T> Entities { get; set; }

実行時まで設定/認識されませんか?

次のようなメソッドを持つリポジトリを作成したい

public TEntity Find<TEntity>(object key) where TEntity : class
{
    return _context.Set<TEntity>().Find(key);
}

public void Update<TEntity>(TEntity entity) where TEntity : class
{
    if (_context.Entry(entity).State == EntityState.Detached) //entity is detached 
        _context.Set<TEntity>().Attach(entity);
    _context.Entry(entity).State = EntityState.Modified;
}

.... etc

そして、それらを次のように使用します。

Widget w = repository.Find<Widget>(123);
repository.SaveChanges();

リポジトリのコンテキストがを含むクラスに設定されている場合、これは簡単ですが、DbSet<Widget> Widgets使用する予定のエンティティタイプが実行時までわからないように、または実際に使用するまでわからないようにすることはできますか?新しいクラスFooがある場合、 最初にDbContextクラスにを.Find<Foo>(123)追加しなくても、すぐにリポジトリにクエリを実行できますか?DbSet<Foo> Foos

pocoクラスまたはそれらへの参照を保持するDbContextインスタンスについて特別なことは何もないので、これは可能であると思います。

4

1 に答える 1

2

DbSet<Foo> Foosコンテキストにプロパティは必要ありません。Fooこれは、エンティティの存在についてコンテキストを伝える1つの方法にすぎません。コンテキストがマップされたエンティティを検出する方法は複数あります。

  • 明示的なDbSet<T>プロパティによる
  • すでに検出されたエンティティのナビゲーションプロパティによる
  • でマッピングを指定するDbModelBuilder
    • OnModelCreatedコンテキストタイプでオーバーライドする
    • 手動で作成DbModelBuilderし、ビルドしてコンパイルし、コンストラクターDbCompiledModelに渡すことができますDbContext
    • EntityTypeConfiguration<T>エンティティごとに宣言し、に追加しDbModelBuilderます(手動で作成されたOnModelCreatedものまたは手動で作成されたもののいずれかDbModelBuilder)。

最後のオプションは、アプリケーションの起動時に必要なすべてのエンティティを検出するために使用できます(たとえば、すべてのエンティティ構成クラスのアセンブリを検索し、それらをモデルビルダーに登録することによって)が、それでも完全に動的なソリューションではありません。コンパイルされたモデルは通常、コンテキストが初めて使用されるときに、アプリケーションの実行ごとに1回だけ構築されます。コンパイルされたモデルを置き換えないと、マップされたエンティティタイプをコンテキストに追加または削除できません。

于 2013-02-12T09:48:55.400 に答える