Базовая конфигурация 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, чтобы обойти эту проблему.