0

私はEntityFramework4.0を初めて使用し、C#で使用しており、現在その機能を試しています。

私が気付いたのは、ほとんどの同様のORMと同様に、生成されたエンティティで行われるデータ操作とCRUDステートメントの生成を処理するためにContextオブジェクトに依存していることです。

つまり、変更をデータベースに保存し直す場合は、エンティティをインスタンス化したObjectContextへの参照に常にアクセスできる必要があります。

アクセス可能なスコープ(たとえば、同じメソッド)でコンテキストが作成されている場合は問題ありませんが、エンティティまたはエンティティセットをメソッドに渡し、このメソッドに変更を保存させたい場合はどうなりますか?ObjectContextをパラメーターと一緒に渡すのが唯一の簡単な方法のようです。

別の解決策は、ObjectContextをある種のグローバル変数に配置することです。言うまでもなく、これらのアプローチの両方にスタイリングと保守性の問題があります。

要するに、私が想像できる最善の方法は、エンティティまたはエンティティセットからObjectContextへの参照を取得することです。デフォルトでは不可能であることを私は知っています。

エンティティからObjectContextを取得するための拡張メソッドの追加を示すメソッドを見つけました。ただし、関係のあるエンティティに対してのみ機能し、作成者によると、このメソッドの呼び出しにはコストがかかります。

T4テンプレートを変更して、すべてのエンティティにContextプロパティを追加し、エンティティのインスタンス化時に自動的に入力することを考えていました。

Entity Frameworkが生成されたクラスに最大長を適用するようにT4テンプレートを一度変更しました(JulieLermanのProgrammingEntity Framework 4の本に従ってください)。これまでのところ、T4構文を本当に楽しんでいるとは言えませんが、それが最善/唯一の方法である場合は、そうしてください...

誰かがすでにそうしましたか?これを処理し、彼のT4テンプレートを共有したり、これを行うためにフックするのに最適な部分的なメソッドやイベントを説明したりするための最良の方法は何でしょうか?

そのようなアプローチを使用することに大きな欠点はありますか?ObjectContextへの参照が非常に多いと、エンティティの一部がスコープ内に残っている場合、GCによる再収集の機能が妨げられたり遅れたりする可能性があると思いますが、実際にはObjectContextを使用できなくなりました。

どうもありがとう。

4

1 に答える 1

0

オブジェクトコンテキストをエンティティと一緒にパラメータとして渡す必要がある場合は、何か間違ったことをしています。

通常、コンテキストは明確に定義されたレイヤーでのみ必要です。ロジックへのコンテキストを必要とするこのレイヤーのすべてのクラスは、特殊なクラスであるコンテキストプロバイダー(サービスロケーターとも呼ばれます)を介してコンテキストを受け取ることができます。コンテキストプロバイダーは、現在のコンテキストインスタンスを一部のストレージに保持します。独自のインスタンスを作成することも、スレッドごと、httpリクエストごとなどに保存することもできます。

クラスに複数のコンテキストインスタンスが必要な場合は、ファクトリとしても機能するようにプロバイダーを変更できます。

別の一般的なアプローチは、依存性注入と組み合わされます。コンストラクター(またはプロパティ)を介してコンテキストをクラスに渡し、必要なすべての初期化を実行する(必要なインスタンスを作成し、それらにすべての依存関係を渡す)ブートストラッパーコードを作成します。ここでも、コンテキストまたはファクトリを渡すことができます。これは通常、配管を行うIoCコンテナと一緒に使用されます。

このインフラストラクチャを準備したら、エンティティをそのレイヤーから初期化されたクラスに渡すことができ、コンテキストが利用可能になります。

于 2011-08-19T08:39:16.213 に答える