1

私は Entity Framework (5.0 以降) を学び始めたばかりで、いくつかの問題に直面しています。Pluralsight でいくつかのビデオを見た後、クリエイティブになることに決め、DbContext から継承され、ジェネリック型の DbSet である単一の「DataContext」プロパティを公開する抽象基本クラスを作成しました。このようなもの:

public abstract class BaseDataContext<E> : DbContext
     where E : CustomEntity
{
      public DbSet<E> DataContext {get;set;}

      public BaseDataContext()
      {
           Database.SetInitializer<BaseDataContext<E>>(null);
      }
 }

これは、互いに関係のあるエンティティ (親/子) を扱い始めるまではうまく機能しているように見えました。発生していたのは、BaseDataContext を継承したデータ クラスを介して新しい子エンティティをデータベースに追加しようとしたときに、単に参照をアタッチするのではなく (つまり、子を取得して「親キーは 123 です」と言う)、別のエンティティを作成したことです。親の新しいキーを持つレコードと他のすべてのフィールドが複製され、この新しいレコードが子の親になりました。私は自分の子供のキー プロパティを設定しようとしましたが (データで公開されたプロパティを無効にしました)、何も変わりませんでした。私がやろうとしていたことのように複数のデータコンテキストを実行するのは良い考えではなく、何が起こっているのかを正確に説明しているように見えるSO ( here ) のスレッドを見つけました。

これに対する私の質問は、EF の人気が高まっているようですが、これは一般的なアプローチですか? どこでもコンストラクターで渡される単一のデータ コンテキストを作成するには? または、より一般的なより簡単な方法はありますか?これは、コンテキストを渡すことが困難になる可能性があるため、バックグラウンド スレッドに入る場合に特に当てはまります。

前もって感謝します!

4

1 に答える 1

2

意図したとおりに使用すると、他のツールと同様に EF を最大限に活用できます。だから、あなたが尋ねるのは良いことです。Entity Framework、特にコード ファーストは、永続性の無視に関するものです (例についてはこちらで説明されています)。「EF/L2Sの前にあなたがしたように」というあなたのコメントが何を指しているのかわかりませんが、アクティブレコードのように聞こえます. それは行くべき道ではありません。

コンテキストは、ストアからのエンティティの具体化、変更の追跡、データベースへの変更の保存を担当します。より詳細には、コンテキストは作業単位を管理し (変更の追跡)、そのDbSetメンバーは基本的なリポジトリとして機能します (マテリアライズと保存)。エンティティ クラス自体はこれについて何も知りません。(補足として: ObjectContextAPI ではそうしますが、永続性を無視してコード化することができます)。

次に「複数のコンテキスト」についてです。あなたが参照する質問は、同じコンテキストタイプの複数のコンテキストインスタンスに関するものです。あなたの質問は、複数のコンテキストタイプ(および必然的に複数のインスタンス) に関するものです。これを整理しましょう:

  • コンテキスト タイプの数: コンテキスト タイプの数が非常に限られているのが一般的です。多くの場合、1 つだけです。なんで?データベースの大部分をカバーするコンテキストは、多くの異なるオブジェクト グラフを取得して永続化できるためです。そのため、現在および将来、安定して変化する多数のユースケースに対応していますが、それ自体は安定しています。アプリケーションが変更されたときではなく、データベースが変更されたときにのみ変更されます。(ユースケースごとに1つのコンテキストタイプの支持者がいると言わなければなりませんが、それらが共通のクラスを多数持っていることは避けられず、非常に紛らわしいことがわかりました)。
  • コンテキスト インスタンスの数:この問題を一言で説明することはできませんが、コンテキストは (1) データをキャッシュし、(2) 変更を追跡して保存することを覚えておく必要があります。そのため、存続期間の長いコンテキストにはすぐに古いデータが含まれ、変更が発生するとサイズが大きくなります。コンセンサスは、コンテキストを「短命」に保つことですが、短命とは何ですか? HTTP リクエストごとに 1 つのインスタンス、サービス コールごとに 1 つ、(ビジネス) トランザクションごとに 1 つだけでなく、MDI インターフェイスのフォームごとに 1 つ、スレッドごとに 1 つのインスタンスにすることもできます。同じことが EF コンテキスト (または NHibernate セッション) にも当てはまります。1 つ明確なことがあります。1 つの静的コンテキストを使用しないでください。そうしたくなる人もいます。

ですから、できる限りクリエイティブになり、できる限り実験してください。意図したとおりに EF を使用し、多くの楽しみを持ってください!

于 2012-11-03T22:37:58.150 に答える