Базовая конфигурация Entity Framework от одного до нуля или одно отношение с тем же первичным ключом

В моем проекте.NET MVC мои доменные классы имеют отношение один к одному или ноль как:

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

    public string FullName { get; set; }

    public Address Address { get; set; }
}

public class Address
{
    public string Address { get; set; }
    public string City { get; set; }

    public virtual Person Person { get; set; }
    [Key, ForeignKey("Person")]
    public int PID { get; set; }
}

Это использует EF 6.x, а объект Address использует PID (внешний ключ) в качестве столбца идентификации. Этот код автоматически настраивается в EF 6.x без какой-либо явной настройки.

Сейчас я портирую это решение на.NET Core 2.1. Здесь EF Core не работает с аннотациями данных EF 6.x. Я не могу, например, получить собственность person.Address.City Похоже, мне нужно настроить его вручную с помощью FluentAPI.

До сих пор я пробовал три разных конфига, один за другим безрезультатно:

//First config
       modelBuilder.Entity<Person>()
            .HasOne(p => p.Address)
            .WithOne(a => a.Person);

//Second config
        modelBuilder.Entity<Person>()
            .OwnsOne(p => p.Address);

//Third config
        modelBuilder.Entity<Person>()
            .OwnsOne(p => p.Address)
            .OwnsOne(a=>a.Person);

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

1 ответ

Ваша первая попытка была близка, вам просто нужно указать, какое поле является внешним ключом отношения, используя метод HasForeignKey:

modelBuilder.Entity<Person>()
    .HasOne(p => p.Address)
    .WithOne(a => a.Person)
    .HasForeignKey<Address>(a => a.PID);

И ради полноты:

public class Address
{
    [Column("Address")]
    public string Addr { get; set; }
    public string City { get; set; }

    public virtual Person Person { get; set; }
    [Key]
    public int PID { get; set; }
}

Вам больше не нужен атрибут ForeignKey в свойстве PID, так как это отношение настроено свободно. Кроме того, ваш код вызвал ошибку компилятора, поскольку классы не могут иметь членов с одинаковыми именами. Поэтому я добавил атрибут Column, чтобы обойти эту проблему.

Другие вопросы по тегам