Платформа объекта 4 Кода Сначала и новое () Оператор

У меня есть довольно глубокая иерархия объектов, которые я пытаюсь сохранить с Платформой Объекта 4, ПОСТЕПЕННО, PI (Незнание Персистентности) и Код Сначала. Внезапно вещи начали работать вполне прилично, когда это рассветало на мне для не использования нового () оператор. Как первоначально записано, объекты часто используют новый () для создания дочерних объектов.

Вместо этого я использую свое взятие на Шаблоне Репозитория для создания всех дочерних объектов по мере необходимости. Например, данный:

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

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

class GrandChild
{
}

("GivenInput" подразумевает некоторую обработку, не показанную здесь),

Я определяю AdamRepository как:

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

Теперь, это работает достаточно хорошо. Однако я больше не "незнаком" со своим механизмом персистентности, поскольку я отказался от нового () оператор.

Кроме того, я подвергаюсь риску анемичной модели предметной области, так как такая логика оказывается в репозитории, а не в объектах области.

После очень прощайте, вопрос:

Или скорее несколько вопросов...

  • Этот шаблон требуется работать с Кодом EF 4 Сначала?
  • Существует ли способ сохранить использование новых () и все еще работать с EF 4 / ПОСТЕПЕННО / Код Сначала?
  • Есть ли другой шаблон, который оставил бы логику в объекте области и все еще работал бы с EF 4 / ПОСТЕПЕННО / Код Сначала?
  • Это ограничение будет снято в более поздних версиях Кода, Сначала поддерживают?

Иногда попытка пойти ПОСТЕПЕННО / маршрут Незнания Персистентности испытывает желание плавать в восходящем направлении, другие времена, как плавать Niagra-Falls. Однако, я хочу верить...

6
задан Eric J. 13 June 2010 в 21:08
поделиться

1 ответ

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

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

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

var adam = myAdamRepository.GetAdam ();

var cain = new Child ();

adam.Children.Add (cain);

~ Роуэн

4
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: