Ошибка при создании миграции для отношения Один-к-одному с использованием EFCore - PullRequest
1 голос
/ 06 мая 2019

У меня есть две модели, как показано ниже:

public class Person{

   public virtual int Id { get; set; }
   public virtual int BaseId { get; set; }
   public virtual string Name { get; set; }
   public virtual Employee Employee { get; set; }
}

public class Employee{

   public virtual int Id { get; set; }
   public virtual string Code{ get; set; }
   public virtual Person Person { get; set; }
}

Каждый Employee является Person, но каждый Person не обязательно является Employee.Отношение между этими двумя типами является отношением One-One, но мне нужно установить это отношение между столбцом без первичного ключа (Person.BaseId) и желаемым столбцом внешнего ключа (Employee.Id).На первый взгляд, столбец Id в модели Employee является одновременно столбцом первичного и внешнего ключей.

У меня есть такая конфигурация сопоставления:

 public override void Configure(EntityTypeBuilder<Person> builder)
    {
        builder.HasKey(x => x.Id);
        builder.ToTable("tblPeople", "dbo");

        builder
            .HasOne(p => p.Employee)
            .WithOne(p => p.Person)
            .HasForeignKey<Employee>(p => p.Id)
            .HasPrincipalKey<Person>(p => p.BaseId);
    } 

  public override void Configure(EntityTypeBuilder<Employee> builder)
    {
        builder.HasKey(x => x.Id);
        builder.ToTable("tblEmployees", "dbo");
    }

Когда я пытаюсьсгенерировать миграцию Я получаю следующую ошибку:

Не удалось определить дочернюю / зависимую сторону для отношений один-к-одному между «Employee.Person» и «Person.Employee».Чтобы определить дочернюю / зависимую сторону отношения, настройте свойство внешнего ключа.Если эти переходы не должны быть частью одного и того же отношения, настройте их без указания обратного.См. http://go.microsoft.com/fwlink/?LinkId=724062 для получения более подробной информации.

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

1 Ответ

1 голос
/ 06 мая 2019

Я нашел решение, ошибка была в моем EntityTypeConfiguration дизайне классов.У меня был следующий дизайн: Для простоты я обрезал код

public abstract class BaseMap<T, U> : IEntityTypeConfiguration<T> where T: BaseEntity<U>
{
    public virtual void Configure(EntityTypeBuilder<T> builder)
    {
        builder.HasKey(x => x.Id);
    }
}

public abstract class ChildBaseMap<T, U> : BaseMap<T, U> where T: ChildBaseEntity<U>
{
    public virtual void Configure(EntityTypeBuilder<T> builder)//<== virtual is wrong here as I need to override the parent Configure
    {
        base.Configure(builder);

        builder.Property(x => x.BaseId).IsRequired();
    }
}

public class PersonMap : ChildBaseMap<Person, int>
{
    public override void Configure(EntityTypeBuilder<Person> builder)
    {
      ....

Просто override метод Configure вместо определения его как virtual in ChildBaseMap класс решит проблему!

...