WithOptionalDependent vs WithOptionalPrinciple - окончательный ответ?
Я подумал, что было бы полезно получить окончательный ответ о том, когда следует использовать WithOptionalDependent
и когда использовать WithOptionalPrincipal
. Помощь для двух функций немного неясна, и я нахожусь в поиске нескольких ответов и ответов на переполнение стека на других сайтах, сочетающих ответы, чтобы быть уверенными, что у меня сложились отношения в правильном направлении.
Здесь MSDN говорит о WithOptionalDependent
:
Настраивает связь как необязательную: необязательно без навигационной собственности на другой стороне отношений. Лицо тип, который будет сконфигурирован, будет зависимым и содержать внешний ключ к директору. Тип объекта, для которого цели отношений будут быть главным в отношениях.
и вот что он говорит о WithOptionalPrincipal
:
Настраивает связь как необязательную: необязательно без навигационной собственности на другой стороне отношений. Лицо тип, который будет сконфигурирован, будет основным в отношении. тип объекта, что целевые показатели отношений будут зависимыми и содержат внешний ключ для принципала.
Строка "Конфигурируемый тип объекта" - это та часть, которая меня всегда смущает (и я предполагаю, что другие).
В этом примере:
class MyEntityA
{
[Key]
public int Id { get; set; }
public int BId { get; set; }
[ForeignKey("BId")]
public MyEntityB B { get; set; }
}
class MyEntityB
{
[Key]
public int Id { get; set; }
}
modelBuilder.Entity<MyEntityA>().HasOptional(a => a.B).WithOptionalDependent();
: "Тип объекта настроен", относящийся к MyEntityA
или MyEntityB
? Я предполагаю, что это первый.
Если это правильно, какой пример использования WithOptionalPrincipal
?
Я действительно думаю, что в моем примере кода это действительно должно быть WithMany
и ни один из параметров WithOptional. Ясно, я все еще смущен!
Есть перегрузки для обеих этих функций, которые перехватывают свойство навигации в другом направлении. Я предполагаю, что эти перегрузки не меняют эти ответы, но, пожалуйста, поправьте меня, если я ошибаюсь.
Я надеюсь, что это будет полезно и для более крупного сообщества.
Ответы
Ответ 1
Для exmaple, измените свойство EntityB
на навигацию и сделайте BId
допустимым значение null (как мы говорим о необязательном отношении).
class MyEntityA
{
[Key]
public int Id { get; set; }
public int? BId { get; set; }
[ForeignKey("BId")]
public virtual MyEntityB B { get; set; }
}
class MyEntityB
{
[Key]
public int Id { get; set; }
public virtual MyEntityA A { get; set; }
}
то мы можем использовать:
modelBuilder.Entity<MyEntityB>().HasOptional(a => a.A).WithOptionalPrincipal();
MyEntityA
имеет FK
до MyEntityB
, поэтому в своем exapmle вы настраиваете MyEntityA
и используете WithOptionalDependent. Но вы можете начать настройку с MyEntityB
-side, тогда вам понадобится WithOptionalPrincipal.
Ответ 2
Ответ на ваш вопрос: "Конфигурируемый тип объекта" MyEntityA
Это можно увидеть окончательно, посмотрев документацию для
OptionalNavigationPropertyConfiguration<TEntityType, TTargetEntityType>
который является типом, возвращаемым HasOptional
и который гласит:
TTargetEntityType
Тип сущности, к которому относится отношение.
который предоставляет больше контекста для фраз:
Тип объекта, который настроен
Тип объекта, для которого цель отношения
Итак, в вашем случае вы вернетесь из HasOptional
a
OptionalNavigationPropertyConfiguration<MyEntityA, MyEntityB>
Таким образом, WithOptionalDependent
означает, что MyEntityB
будет Принципалом с дополнительным навигационным свойством, возвращающимся обратно к MyEntityA
(заданному параметром lambda перегрузки), а MyEntityA
будет зависимым и содержать внешний ключ и Свойство навигации (как указано в параметре лямбда HasOptional
). Это сценарий в вашей модели.
И наоборот, WithOptionalPrincipal
означает, что MyEntityA
будет Принципалом и MyEntityB
зависимым с внешним ключом и навигационным свойством.