Что такое независимые ассоциации и ассоциации с иностранными ключами?

Возможный дубликат:
Code First: Независимые ассоциации и ассоциации внешних ключей?

В EF 4 или EF 5 Code Сначала, что такое "независимая ассоциация" и что такое "ассоциация внешних ключей", как используется в MSDN или Внешний ключ или независимые отношения - есть ли улучшение с Entity Framework 5? (выделено мной):

2.4.1 Использование ассоциаций внешних ключей для уменьшения стоимости создания прогноза

Мы видели ряд случаев, когда коммутация ассоциаций в модель от Независимых ассоциаций до Ассоциации внешних ключейзначительно улучшило время, затраченное на создание поколений.

Итак - теперь я знаю, что использовать. Если бы я знал, что это такое и как можно было бы превратить в него! Итак, мой вопрос: как бы вы определили эти термины? Что говорит беглый/аннотации/соглашения?

Ответ 1

Ассоциация внешних ключей - это то, где у вас есть свойство внешнего ключа в вашей модели в дополнение к соответствующему навигационному свойству. Независимая ассоциация - это когда у вас есть столбец внешнего ключа в вашей базе данных, но свойство внешнего ключа, соответствующее этому столбцу, отсутствует в вашей модели, то есть у вас есть свойство NavigationProperty, но не существует свойства внешнего ключа, которое сообщит вам, какое значение идентификатора связанное с этим свойство, фактически не переходит к соответствующему свойству.

Вот пример модели с независимой ассоциацией (обратите внимание, что зависимый не имеет внешнего ключа - просто свойство навигации):

public class Dependent
{
    public int Id { get; set; }

    [Required]
    public Principal PrincipalEntity { get; set; }

}

public class Principal
{
    public int Id { get; set; }
    public ICollection<Dependent> DependentEntities { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Dependent> Dependents { get; set; }
    public DbSet<Principal> Principals { get; set; }
}

И вот пример той же модели, но с Ассоциацией ForeignKey (обратите внимание на свойство PrincipalEntity_Id и атрибут [ForeignKey()]:

public class Dependent
{
    public int Id { get; set; }

    public int PrincipalEntity_Id { get; set; }

    [Required]
    [ForeignKey("PrincipalEntity_Id")]
    public Principal PrincipalEntity { get; set; }

}

public class Principal
{
    public int Id { get; set; }
    public ICollection<Dependent> DependentEntities { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<Dependent> Dependents { get; set; }
    public DbSet<Principal> Principals { get; set; }
}

Обратите внимание, что ваша база данных не будет меняться - базовая база данных всегда имела столбец для внешнего ключа, но с независимой ассоциацией, которая не была обнаружена.

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

Ответ 2

Просто мое мнение о том, почему нужно использовать независимые или внешние ассоциации:

Независимые ассоциации

Плюсы:

  • Это правильный путь в объектно-ориентированном мире. В объектно-ориентированном мире мы используем ссылки внутри наших агрегатов, а не какие-то волшебные ключи.

Минусы:

  • С чистым POCO вы не знаете, действительно ли основное отношение действительно NULL или просто не загружено, потому что в обоих случаях ваша ссылка равна null. Вы должны задать контекст для разных двух нулей. Это не было проблемой с тяжелыми базовыми объектами EntityObject, где каждое свойство навигации для основного объекта было сопряжено с другим свойством, суффиксом Reference, предоставляющим некоторые дополнительные сведения о связи.
  • EF способ управления независимыми ассоциациями довольно сложный, особенно когда речь идет о прикреплении графиков отдельных объектов. Каждая независимая ассоциация имеет свое собственное состояние и никогда не может находиться в состоянии Modified. Каждая модификация всегда состоит из установки старого отношения как удаленной и создания нового отношения как добавленного - это реальный беспорядок, когда вы пытаетесь его использовать.
  • Сообщалось, что независимые ассоциации значительно замедляют создание представления во время инициализации EF (или во время предварительного предсказания).
  • Независимая ассоциация может быть гораздо сложнее использовать в сценариях привязки данных, где вам нужно связать только внешний ключ.

Ассоциации внешних ключей

Плюсы:

  • Простой. Ключевые свойства просты в управлении, и они решают все проблемы с независимыми ассоциациями - нет состояния для иностранных ассоциаций, прямой привязки данных, непосредственной видимости, если существует отношение (ключ не является нулевым) и т.д.

Минусы:

  • Они концептуально ошибочны и предлагают их в EF - это большой шаг назад от объектного мира к реляционному миру. Я по-прежнему считаю, что правильное решение улучшало или изменяло способ обработки независимых ассоциаций, даже если это может привести к огромным нарушениям между EFv1 и EFv4. Мне также не нравится текущая ситуация, когда у нас есть два типа ассоциаций с совершенно другим поведением. Должен быть только один тип с четко определенным поведением и необязательными свойствами внешнего ключа, которые отображаются на объекте.

Это различие имеет значение только для ассоциаций "один-ко-многим", поскольку индивидуальные отношения всегда являются внешними ассоциациями, а многие-ко-многим всегда являются независимыми ассоциациями.