Entity Framework 4 Code First и оператор new () - PullRequest
6 голосов
/ 13 июня 2010

У меня довольно глубокая иерархия объектов, которую я пытаюсь сохранить с помощью 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 возникает ощущение плавания вверх по течению, а иногдаэто похоже на плавание Ниагарского водопада.Тем не менее, я хочу верить ...

1 Ответ

4 голосов
/ 15 июня 2010

Вот пара моментов, которые могут помочь ответить на ваш вопрос:

В ваших классах у вас есть поле для коллекции детей и метод для добавления к детям. EF в целом (не только Code First) в настоящее время требует, чтобы коллекции были поверхностью как свойствами, поэтому этот шаблон в настоящее время не поддерживается. Большая гибкость в том, как мы взаимодействуем с классами, является распространенным вопросом для EF, и наша команда сейчас смотрит, как мы можем поддержать это в данный момент

Вы упомянули, что вам необходимо явно регистрировать сущности в контексте, это не всегда так. В следующем примере, если GetAdam () вернул объект Adam, который присоединен к базовому контексту, EF автоматически обнаружит новый дочерний Cain при сохранении и вставке в базу данных.

var adam = myAdamRepository.GetAdam ();

var cain = new Child ();

adam.Children.Add (Cain);

~ Роуэн

...