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 ルートに行こうとすると、上流に泳いでいるように感じることもあれば、ナイアグラの滝を泳いでいるように感じることがあります。それでも信じたい…