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

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

В EF 4 или EF 5 Code First, что такое «независимая ассоциация» и что такое «ассоциация внешнего ключа», как используется в MSDN или Внешний ключ по сравнению с независимыми отношениями — есть ли улучшение с Entity Framework 5? (выделение добавлено):

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

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

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


person Scott Stafford    schedule 26.09.2012    source источник
comment
@LadislavMrnka: Сначала я изучил этот вопрос, но обнаружил, что он не так ясен в определениях и немного другом направлении, а именно: ПОЧЕМУ использовать одно или другое, а не просто определять, ЧЕМ они были.   -  person Scott Stafford    schedule 26.09.2012
comment
Вы должны изменить свой вопрос, потому что на данный момент он спрашивает, что это за ассоциации и как их создавать, и это именно то, что дает связанный вопрос. Если вы также хотите знать, почему использовать каждый из них, задайте свой вопрос напрямую.   -  person Ladislav Mrnka    schedule 26.09.2012
comment
Я смиренно прошу не согласиться. В конце он формулирует свой вопрос: есть ли существенные недостатки в использовании независимых ассоциаций? и... Если их нет, то в чем причина вообще использования ассоциаций внешних ключей? Другими словами, почему я использую каждый? Все, что я хочу знать, это то, что означают эти две фразы и как сделать что-то одним или другим.   -  person Scott Stafford    schedule 26.09.2012
comment
Тем не менее, я попытался уточнить ЧТО дальше, дайте мне знать, если это поможет.   -  person Scott Stafford    schedule 26.09.2012
comment
@ScottStafford: Я полностью согласен с вашими комментариями выше, у меня было такое же чувство после перехода по ссылке на другой вопрос.   -  person Veverke    schedule 07.07.2016


Ответы (2)


Ассоциация внешнего ключа — это когда у вас есть свойство внешнего ключа в вашей модели в дополнение к соответствующему свойству навигации. Независимая ассоциация — это когда у вас есть столбец внешнего ключа в вашей базе данных, но свойство внешнего ключа, соответствующее этому столбцу, отсутствует в вашей модели, т. е. у вас есть свойство 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; }
}

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

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

person Pawel    schedule 26.09.2012

Просто мое мнение о том, ПОЧЕМУ использовать независимые или внешние ключевые ассоциации:

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

Плюсы:

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

Минусы:

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

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

Плюсы:

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

Минусы:

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

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

person Ladislav Mrnka    schedule 26.09.2012
comment
+1 за последнее предложение. это не было очевидным для меня начало. - person parliament; 25.03.2013
comment
@Ladislav Mrnka - это отличный ответ. Мне было интересно, есть ли какие-либо существенные обновления для этого ответа, поскольку EF отсутствует в v6? В настоящее время я разрабатываю совершенно новое веб-приложение, и я изо всех сил пытаюсь понять, по какому пути мне идти. - person janhartmann; 10.07.2014
comment
@meep: я больше не работаю с EF, но я не думаю, что что-то изменилось в EF6 - у вас все еще есть эти два варианта. Использование ассоциаций внешнего ключа может снизить сложность некоторых задач разработки при работе с отсоединенными объектами, что часто может происходить в веб-приложениях. - person Ladislav Mrnka; 10.07.2014