0

コードのモダナイゼーション イニシアチブの一環として、Entity Framework を使用して自社開発の ORM を強化 (そして最終的には置き換える) 方法を見つけようとしています。ORM 自体は、前のステップであった単純な SQL 呼び出しから大きく前進していますが、インフラストラクチャの残りの部分が引き上げられたので、段階的に廃止を開始したいと考えています。

そのために、現在の ORM と同じように動作するように、Entity フレームワークを介してクラスを構築する方法を見つけようとしています。理想的には、クラスの再設計に必要なコードの変更はなく、遅延読み込みや、データベースに一致するクラスの生成/更新の容易さなどの機能が得られます。

現在の ORM は、事実上、SQL ステートメントを作成するための非常に洗練されたラッパーです。 Part p = new Part(12345);が実行さselect * from parts where partID = 12345れ、返された DataRow を取得し、リフレクションを使用してオブジェクトのフィールドに入力します。保存するときもほとんど同じことを行います。すべてのフィールドを取得し、それを使用してデータ行を更新し、それをデータベースに書き戻します。通常、編集されると予想される場合、データベース内の行もロックします。ちょっと不器用ですが、うまくいきます。

エンティティ フレームワークとテンプレートを使用して、永続的なデータ コンテキストを必要としない方法でクラスを自動的に生成する方法を見つけようとしています。現在の方法では、必要な場所にオブジェクトを作成し、必要に応じて渡すことができ、オブジェクトが更新されると、データベースがそのオブジェクトに一致するように更新されることがわかります。(タイトルのとおり) さまざまなことを調べましたが、オブジェクト ライブラリの外部でコンテキストが不要になるように、どの方法を使用できるかわかりません。

誰かが私を正しい方向に向けることができますか?


編集: 私はあまりにも多くを求めているか、四角いペグを丸い穴に押し込もうとしているのかもしれません. 私が探しているものを単純化して、最小限に抑えてみましょう。

これを構造化して、外部で有効なCRUDタイプのオブジェクトを作成しusing (var context = new Context()) {}て、無関係なコードに渡すことができる方法はありますか? コンテキスト外で動作する限り、ロード/保存するためにコンテキストに戻す必要があるかどうかは気にしません。

EF を使用してこれが不可能な場合、このシナリオの正しい設計パターンは次のとおりです。1 つのフォームが別のフォームを開き、請求書を渡します。2 番目のフォームはその Invoice を取得し、ユーザーに支払いを入力してもらい、新しい Payment オブジェクトを生成します。最初のフォームはその Payment オブジェクトを受け取り、それに基づいて Invoice に対してさらに処理を行います。次に、すべてが一度にデータベースにコミットされます。

4

3 に答える 3

0

EFで遅延読み込みが本当に必要な場合は、確かにEF DbContext /ObjectContextを作成する必要があります。永続化ロジックなどの無関係なコードを削除して、現在のクラスをPOCOクラスに変換することは大したことではないと思います。EFコンテキストを操作するサービスレイヤーを介して永続レイヤーを抽象化することをお勧めします。たとえば、フォームがサービスレイヤーを呼び出し、サービスレイヤーがコンテキストのインスタンスを作成してデータを永続化/取得します。

于 2012-06-08T14:31:52.257 に答える
0

POCO、POCO with Proxy、または STE のいずれも、アーキテクチャと一致しません。これらすべてのエンティティ タイプのポイントは、エンティティの永続性を無視することですが、エンティティは永続性を実装します。モデルに最も近いのは古い DataSet です。

EF の中心点はコンテキストです。アーキテクチャを維持したい場合は、すべてのエンティティが独自のコンテキストを処理する必要があります。それがEFアンチパターンです。EF では、コンテキストがあり、そのコンテキストを使用してエンティティを取得して永続化することが想定されています。ほとんどの EF 機能は、このパターンに依存しています。

于 2012-06-08T07:56:39.463 に答える
0

POCO を使用してコンテキストのプロキシ生成をオフにした場合 (または、コンテキストを破棄する前にそれらをデタッチした場合)、エンティティは using context 句の外で有効になります。

using context 句の外で有効にする必要があるコレクション プロパティがオブジェクトにある場合は、クエリで include を使用するか、using context 句を終了する前に追加のクエリを入力する必要があります。

于 2012-06-08T19:46:04.917 に答える