У меня довольно глубокая иерархия объектов, которую я пытаюсь сохранить с помощью Entity Framework 4, POCO, PI (Постоянное невежество) и Code First.Внезапно все стало работать довольно хорошо, когда я понял, что я не использую оператор new ().Как было изначально написано, объекты часто используют new () для создания дочерних объектов.
Вместо этого я использую свой шаблон репозитория для создания всех дочерних объектов по мере необходимости.Например, учитывая:
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Во-первых?
- Будет ли снято это ограничение в более поздних версиях поддержки Code First?
Иногда при попытке пройти по маршруту POCO / Persistance Ignorance возникает ощущение плавания вверх по течению, а иногдаэто похоже на плавание Ниагарского водопада.Тем не менее, я хочу верить ...