2009-09-09 13 views
17

Entity FrameworkとASP.Net MVCの初心者です。ほとんどの場合、チュートリアルから深く理解することなく学習しました。 (私は.Net 2.0、ADO.NetとWebFormsに関する経験を持っています)Entity Framework - "Entities"オブジェクトをインスタンス化する方法

私の現在の疑念は、私のEntitiesオブジェクトをインスタンス化していることに由来しています。基本的には

私は私のコントローラでこれをやっている:

public class PostsController : Controller { 

    private NorthWindEntities db = new NorthWindEntities(); 

    public ActionResult Index() { 
      // Use the db object here, never explicitly Close/Dispose it 
    } 
} 

私はこれが正しい方法だったと仮定ように私には十分な権威見えたいくつかのMSDNのブログでそれを見つけたので、私はこのようにそれをやっています。
しかし、私はこれについてかなり簡単ではないと感じています。それは私に多くのコードを保存しますが、私はやってするのに使用しています。接続を必要とし、その方法は、それをする必要があります他の人を呼び出す場合、それはとしてデシベルを渡します一つ一つの方法では

using (NorthWindEntities db = new NorthWindEntities() { 
} 

それらにパラメータ。 Linq-to-SQLが存在する前に、接続オブジェクトを使ってすべてをやったのです。

NorthWindEntitiesはIDisposableを実装していますが、慣例ではDispose()メソッドを呼び出す必要があります。私はそうではありません。

あなたはこれについてどう思いますか?
私が行っているようにエンティティオブジェクトをインスタンス化するのは正しいですか?それぞれのクエリでそれらを開いたり閉じたりして、接続を処理する必要がありますか?
または、using()節を明示的に削除する必要がありますか?

ありがとうございます!

答えて

21

コントローラ自体がIDisposableを実装しています。したがって、Disposeをオーバーライドして、コントローラのインスタンス化時に初期化するもの(オブジェクトコンテキストなど)を破棄することができます。

コントローラは、1つの要求の間のみ有効です。したがって、アクション内での使用とコントローラ全体に対する1つのオブジェクトコンテキストの正確なコンテキスト数は次のとおりです。1.

これらの2つの方法の大きな違いは、ビューがレンダリングされる前にアクションが完了することです。したがって、アクション内のusingステートメントでObjectContextを作成すると、ObjectContextはビューがレンダリングされる前に破棄されます。したがって、アクションが完了する前に必要なコンテキストから何かを読んでいる方がよいでしょう。ビューに渡すモデルがIQueryableのようなレイジーリストである場合、ビューがレンダリングされる前にコンテキストが破棄され、ビューがIQueryableを列挙しようとすると例外が発生します。

対照的に、コントローラが初期化されたときにObjectContextを初期化する(または動作が実行されたときに初期化される遅延初期化コードを書き込む)場合、ObjectContextをController.Disposeに廃棄すると、ビューがレンダリングされたときに周りにいてください。この場合、IQueryableをビューに渡すことは安全です。コントローラは、ビューがレンダリングされた直後に配置されます。

最後に、コントローラにエンティティフレームワークを認識させることはおそらく悪い考えであると指摘していない場合は、私は思い出されません。モデルとリポジトリパターンに別々のアセンブリを使用して、コントローラがモデルと対話するようにします。これでGoogleの検索結果がかなり上がってしまいます。

+0

わかりました。 今、質問は... 私は事を間違ってやっていますか? 本当にEntitiesオブジェクトを破棄する必要はありますか? 私がしないとどうなりますか? SQL Serverへの接続が「リーク」するのですか? –

+1

ObjectContext.Disposeはあまり機能しません(Reflectorを参照)。しかし、それが変わる可能性があると推測することは合理的であり、あなたはそれを処分すべきです。 –

3

あなたはここで良い点を作っています。ObjectContextの存続期間はどのくらいですか?(Dino EspositoのMicrosoft-NET-Architecting-Applicationsのような)すべてのパターンとプラクティスの本は、DataContextが長く生きてはならず、キャッシュされるべきではないことを伝えています。

私はObjectContextがすべてのコントローラに対して一度だけ開始されるControllerBaseクラス(私はMVC実装を認識していないので、私には気にしていません)を持っていないのはなぜだろうかと思いました。特にIdentity Map Patternについて考えてください。これは既にEntity Frameworkによって実装されています。別のコントローラをPostsControllerとして呼び出す必要があるとしても、同じContextで動作し、パフォーマンスが向上します。

関連する問題