2008-09-17 5 views
2

OR/M-APIだけでなく、ストレージ/概念モデルマッピング機能が好きなので、Entity Frameworkを新しいプロジェクトに適用することを検討していますおよびEntity SQL)を使用します。エンティティフレームワークとアプリケーションアーキテクチャ(ルーズカップリングなど)

しかし、EFエンティティが両方のデータ所有者として使用されている場合、UIレイヤーとビジネスレイヤーの間でどのように緩やかな結合が達成されるか。エンティティがUIに常駐している間にObjectContextにアタッチされたままにすると、UIがビジネスレイヤをバイパスしてデータベースに直接接続する可能性があります。エンティティをUIに渡す前にObjectContextからエンティティを切り離すと、チェンジトラッキングが行われないため、ビジネスレイヤのすべての変更をデータベースに保持するために、その変更を「再生」する必要があります(特に難しい親子関係)。ビジネス層を「オブジェクトツリー・パーシスタンス・エンジン」へと低下させたくないのですが、この能力を持つことが有用なシナリオがあります。

これは確かに他のORマッパーにも当てはまりますが、いくつかの代替製品には、やや優れた取り外し/取り付けメカニズムがあるようです。

答えて

-1

Google「エンティティのフレームワーク」と「信頼できない投票」とあなたが得るものを参照してください。

+0

-1:質問との関係がゼロ –

+0

実際にこれを投稿したときを振り返ると、Entity Frameworkがどのように進化したかは注目に値します。当時の問題は、それを使用するためにEFに自分自身を直接結びつけなければならないという事実に基づいていました。物事は今(遠く)良くなった。 – Min

4

"再生する"と思ったよりも簡単に変更を再生できます。

  1. 元のエンティティインスタンスをデタッチしてUIに渡す前に、エンティティインスタンスの「元の」バージョンを保存してください。
  2. UIにそのことをさせてください。
  3. UIによって加えられた変更をデータベースに保持する場合は、保存した元のバージョンを取得し、EntityContextにアタッチします。 UIによって返された変更されたバージョンからの変更をこのインスタンスに適用します。今SaveChanges。 Entity Frameworkは3方向マージを処理します。
+4

一般的に良いアプローチ。しかし、私はどこに元のバージョン(statelesサービス層では特に)を "保存"するのですか?またはDBからリロードすることを意味していますか?また、子コレクションはどうですか?変更状態がない場合、どの子オブジェクトが挿入/削除されたかをどのように見つけることができますか? – Arno

3

私はプラットフォームに依存しないようにするために、n層ソリューションを適切に扱うORMは認識していません。 EFは、ObjectContext内で何が起こっているときにうまく機能します.NTierソリューション(物理的分離、WCF/XML Webサービス呼び出し)を使用すると、オブジェクトを正しく動作させるために配管を行う必要があります。

リポジトリパターンを使用してEf(http://blog.keithpatton.com/2008/05/29/Polymorphic+Repository+For+ADONet+Entity+Framework.aspx)のAPI依存関係を分離することで、緩やかな結合を実現できます。しかし、UIレイヤー内でEFクラスを直接使用している場合は、EFが純粋なC#クラス(POCO)で動作するように掘り下げて決定しない限り、EntityReference、EntityKey、EntityObjectなどの特定のタイプに依存します。それは私にとって価値があるよりも難しいようです。

0

ADO.NetチームのDaniel Simmonsは、変更されたオブジェクトを添付するためにextension method "AttachAsModified"を付けました。

これは、変更を再生するほどスマートではありませんが、それは次のようになります。サンプルプロジェクトに使用しています。

関連する問題