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

В моем проекте .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 Ответ

0 голосов
/ 10 сентября 2018

Ваша первая попытка была близка, вам просто нужно указать, какое поле является внешним ключом отношения, используя метод 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 .

...