Почему "Fixup" необходим для Persistence Ignorant POCO в EF 4?

Одной из наиболее ожидаемых особенностей Entity Framework 4 является способность использовать POCO (простые обычные объекты CLR) в методе ненасилия настойчивости (т.е. они не "знают", что они сохраняются с Entity Framework vs. другой механизм).

Я пытаюсь окутать голову, почему необходимо выполнить фиксацию ассоциации и использовать FixupCollection в моем "обычном" бизнес-объекте. Это требование, по-видимому, подразумевает, что бизнес-объект не может быть полностью не осведомлен о механизме сохранения в конце концов (на самом деле слово "fixup" звучит так, будто что-то нужно исправлять/изменять для работы с выбранным механизмом сохранения).

В частности, я имею в виду область Fixup ассоциации, которая генерируется генератором Entity Entity ADO.NET, например:

    #region Association Fixup

    private void FixupImportFile(ImportFile previousValue)
    {
        if (previousValue != null && previousValue.Participants.Contains(this))
        {
            previousValue.Participants.Remove(this);
        }

        if (ImportFile != null)
        {
            if (!ImportFile.Participants.Contains(this))
            {
                ImportFile.Participants.Add(this);
            }
            if (ImportFileId != ImportFile.Id)
            {
                ImportFileId = ImportFile.Id;
            }
        }
    }

    #endregion

а также использование FixupCollection. Другие распространенные ненасильственные ORM не имеют подобных ограничений.

Это связано с фундаментальными проектными решениями в EF? Является ли некоторый уровень невежества здесь, чтобы остаться даже в более поздних версиях EF? Есть ли разумный способ скрыть эту постоянную зависимость от разработчика POCO?

Как это работает на практике, от конца до конца? Например, я понимаю, что поддержка была добавлена ​​недавно для ObservableCollection (что необходимо для Silverlight и WPF). Есть ли ошибки в других слоях программного обеспечения из требований к проектированию EF-совместимых объектов POCO?

Ответы

Ответ 1

Нашли несколько объяснений - проверьте их!

Параметры генерации кода шаблона POCO (блог группы EF)

Fixup

Метод фиксации записывается для каждого навигационное свойство на объекте и вызывается из сеттера навигационного свойства, когда его значение изменения. Его цель - обеспечить, чтобы каждый конец двунаправленного отношения находятся в синхронизации с прочее. Например, в режиме "один ко многим" отношения между Cutomer и Заказ, когда установлен Order.Customer, метод fixup гарантирует, что Заказ находится в Заказе клиентов коллекция. Он также соответствующее свойство внешнего ключа а именно Order.CustomerID в синхронизации с новое значение первичного ключа клиента (ID). Эта логика может быть полезна, если POCO объекты используются независимо от EF-стек, как и для написания тестов против них, которые не попали в база данных. Fixup гарантирует, что граф объектов связан в одном и том же как вы ожидали бы при использовании их с EF. Методы Fixup немного сложный для записи, и, следовательно, это полезно, чтобы они были автоматически сгенерированы, если вы планируете использовать объекты в независимом от EF сценарии.

И также ознакомьтесь с этим POCO в Entity Framework Part 1, в котором также есть некоторые разделы о том, какие исправления и какие они нужны для.