В EF Core как настроить внешний ключ для ссылочных типов, используя Fluent API - PullRequest
0 голосов
/ 25 марта 2020

В объекте Company я включил Address в качестве ссылки принадлежащий тип (так что таблица Company включает свойства адреса в виде столбцов). Ссылка, принадлежащая Address, включает Country, удерживая внешний ключ CountryCode, который является свойством класса Address. Поэтому мне нужно настроить это свойство как внешний ключ.

Когда я использую атрибут ForeignKey("Country") миграция прошла успешно, и таблица создается с правильным столбцом FK: [Companies].[Address_CountryCode]. Однако я хочу использовать Fluent API для всех моих конфигураций EF Core DbContext. И это терпит неудачу, поскольку миграция обнаруживает конфликт владения Address.

class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }
}

public class Address
{
    public string City { get; set; }
    public string Street { get; set; }
    public string CountryCode { get; set; }
    public Country Country { get; set; }
}
modelBuilder.Entity<Company>().OwnsOne<Address>(c => c.Address);
modelBuilder.Entity<Address>().HasOne<Country>(c => c.Country).WithMany().HasForeignKey(a => a.CountryCode);    

Настройка внешнего ключа через Fluent API в этом случае завершается неудачно со следующим сообщением: The type 'Address' cannot be configured as non-owned because an owned entity type with the same name already exists.. Опять же, с атрибутом ForeignKey он работает, как и ожидалось.

Как правильно настроить это отношение с собственным типом ссылки в Fluent API?

1 Ответ

1 голос
/ 30 марта 2020

Вам необходимо вложить ваши собственные объекты.

modelBuilder.Entity<Company>().OwnsOne<Address>(c => c.Address, a => {
    a.HasOne<Country>(c => c.Country).WithMany().HasForeignKey(a => a.CountryCode);
});

Ссылка: https://docs.microsoft.com/en-us/ef/core/modeling/owned-entities#nested -owned-types

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...