2

このアプリケーションでは、既存の DAL を EF 4.0 から EF 5.0 にアップグレードしています。
現在、一般的なリポジトリ パターンが既に実装されており、ビジネス エンティティとして POCO オブジェクトを使用しています。
これらのオブジェクトは、Web サービス インターフェイスで渡され、さらにビジネスおよび検証メソッドを追加するために部分クラスで拡張されるため、WCF 属性で装飾されます。さらに、各 POCO エンティティは、ジェネリック リポジトリ メソッドを簡単に使用するために、基本クラス「BusinessEntity」とインターフェイス「IBusinessEntity」を継承します。

POCOs オブジェクトからビジネス エンティティを分離して、後者をプロパティのみでロジックのない単純なクラスにすることを計画しています。

ただし、トピックについて読んだ後、現在の最新技術は、Code First アプローチを採用し、ドメイン エンティティを直接永続化することであるようです (もちろん、すべてのケースで一般化することはできませんが)。
関連する回答1関連する回答2

私たちの場合、ビジネス ロジックを含む POCO オブジェクトを保持し、EF 5.0 (DbContext) に関連する変更のみを適用することは理にかなっていますか? それとも、リポジトリ内にマッピング レイヤーを導入する必要がありますか? このようにして、アプリケーションはビジネス エンティティで機能し、リポジトリ レイヤーは POCO オブジェクトを外部から隠します。ただし、特に一般的なリポジトリを扱う場合、複雑さが生じるという欠点があります。

前もって感謝します。

4

1 に答える 1

1

別の関連する問題の解決策を見つけるためにここに来ましたが、あなたの質問に関する私の経験を共有したいと思います。

私が読んだほとんどの人や記事は、EF POCO をビジネス オブジェクトとして使用するように言っています... 私には、EF がこの傾向を促進しているように見えます。

あなたは、システムに POCO を使用した EF が既にあると言いました。反対の角度から見てもらいたいのですが、当初、DAL が純粋な ADO.NET で記述された独自の基本的な「データベース ハンドラ」と独自のビジネス クラスを使用したプロジェクトがあります。しかし今では、さらに Entity Framework もサポートしようとしています (したがって、古い db ハンドラーまたは EF のいずれかをロードします... 後で EF に切り替える可能性があります)。データベースをそのまま維持したいので、データベースファーストのアプローチを採用します。今のところ、既存のビジネス オブジェクトと POCO を簡単に接続する方法を見つけることができませんでした (現在、変換には単純な「プロジェクション」を使用しています)。

したがって、BL では、(1:n 関係)BObject1を持つものを挿入する次の preudo-code は次のようになります。List<BObject2>

 this.UnitOfWork.ExecuteTransaction(() =>
 {
    bObject1_Repository.InsertBObject1(bObject1);

    foreach (var bObject2 in bObject1.ListBObject2)
       bObject2_Repository.InsertBObject2(bObject2);
 });

古い 'db ハンドラー' にはすべて問題ありません。同じトランザクションと暗黙的に同じ接続を再利用します...しかし、EFの場合、非常にトリッキーになります。bObject2 を挿入するには、まず auto-gen が必要になる場合があります。bObject1 の UID (最初の挿入後に既に知られている)... これは、最初の挿入後に SaveChanges を時期尚早に呼び出さない限り、EF では使用できません。複数の「SaveChanges」呼び出しが関与するとすぐに、これらのトランザクションで何が起こるかを考える必要があります。分散トランザクション (DTC) は問題の 1 つになる可能性があります... これは、Oracle データベースをサポートしたいプロジェクトの場合です... 実際、ここで立ち往生しています。

物事を別の角度から見る手助けにもなれば幸いです...

余談:

BL でのトランザクションの使用に関して、EF と Oracle の経験者の意見を聞くとよいでしょう。私の質問にも役立ちます。

于 2013-08-29T08:10:41.407 に答える