使用EFCore为一对一关系生成迁移时出错

时间:2019-05-06 13:45:34

标签: c# entity-framework one-to-one ef-fluent-api ef-core-2.0

我有以下两种模型:

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。两者之间的关系是一对一关系的类型,但是我需要在非主键列(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 个答案:

答案 0 :(得分:1)

我找到了解决方案,错误是我的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类中将其定义为ChildBaseMap即可解决问题!