6

Entity Framework 4、POCO、PI (Persistence Ignorance)、および Code First で永続化しようとしているオブジェクトのかなり深い階層があります。new() 演算子を使用しないことに気づいたとき、突然、物事はかなりうまく機能し始めました。最初に書かれたように、オブジェクトは頻繁に new() を使用して子オブジェクトを作成します。

代わりに、Repository パターンを使用して、必要に応じてすべての子オブジェクトを作成しています。たとえば、次のようになります。

class Adam
{
  List<Child> children;
  void AddChildGivenInput(string input) { children.Add(new Child(...)); }
}

class Child
{
  List<GrandChild> grandchildren;
  void AddGrandChildGivenInput(string input) { grandchildren.Add(new GrandChild(...)); }
}

class GrandChild
{
}

(「GivenInput」は、ここに示されていない処理を意味します)

私は好きなものを定義しますAdamRepository

class AdamRepository
{
    Adam Add() 
    { 
        return objectContext.Create<Adam>(); 
    }
    Child AddChildGivenInput(Adam adam, string input) 
    { 
        return adam.children.Add(new Child(...)); 
    }
    GrandChild AddGrandchildGivenInput(Child child, string input) 
    { 
        return child.grandchildren.Add(new GrandChild(...)); 
    }
}

これで十分に機能します。ただし、new() 演算子を放棄したため、永続化メカニズムについて「無知」ではなくなりました。

さらに、非常に多くのロジックがドメイン オブジェクトではなくリポジトリに配置されるため、貧血ドメイン モデルのリスクがあります。

長いお別れの後、質問:

というか、いくつかの質問...

  • このパターンは、EF 4 Code First を使用するために必要ですか?
  • new() の使用を維持し、引き続き EF 4 / POCO / Code First で動作する方法はありますか?
  • ドメイン オブジェクトにロジックを残し、EF 4 / POCO / Code First で引き続き機能する別のパターンはありますか?
  • この制限は、Code First サポートの以降のバージョンで解除されますか?

POCO / Persistence Ignorance ルートに行こうとすると、上流に泳いでいるように感じることもあれば、ナイアグラの滝を泳いでいるように感じることがあります。それでも信じたい…

4

1 に答える 1

4

あなたの質問に答えるのに役立つかもしれないいくつかのポイントは次のとおりです。

クラスには、子コレクション用のフィールドと、子に追加するメソッドがあります。現在、(Code First だけでなく) 一般的な EF では、コレクションがプロパティとして表示される必要があるため、このパターンは現在サポートされていません。クラスとの対話方法の柔軟性を高めることは、EF の一般的な要求であり、チームは現時点でこれをどのようにサポートできるかを検討しています。

エンティティをコンテキストに明示的に登録する必要があると述べましたが、これは必ずしもそうではありません。次の例では、基になるコンテキストにアタッチされた Adam オブジェクトが GetAdam() によって返された場合、保存してデータベースに挿入すると、新しい子 Cain が EF によって自動的に検出されます。

var adam = myAdamRepository.GetAdam();

var cain = new Child();

adam.Children.Add(カイン);

〜ローワン

于 2010-06-14T23:20:26.810 に答える