Подтвердить что ты не робот

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. Ясно, я все еще смущен!

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

Я надеюсь, что это будет полезно и для более крупного сообщества.

4b9b3361

Ответ 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 зависимым с внешним ключом и навигационным свойством.