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

C# 使用EFCore为一对一关系生成迁移时出错,c#,entity-framework,one-to-one,ef-fluent-api,ef-core-2.0,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 virtu

我有以下两种型号:

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; }
}
每个
员工
都是
,但每个
不一定是
员工
。这两者之间的关系是一对一关系,但我需要在非主键列(
Person.BaseId
)和所需外键列(
Employee.Id
)之间建立这种关系。在face中,
Employee
模型中的
Id
列同时是主键和外键列

我有以下映射配置:

 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");
    }
public override void Configure(EntityTypeBuilder)
{
HasKey(x=>x.Id);
建筑商。ToTable(“tblPeople”、“dbo”);
建设者
.HasOne(p=>p.Employee)
.一人(p=>p.人)
.HasForeignKey(p=>p.Id)
.HasPrincipalKey(p=>p.BaseId);
} 
公共覆盖无效配置(EntityTypeBuilder)
{
HasKey(x=>x.Id);
建筑商。ToTable(“tblEmployees”、“dbo”);
}
当我尝试生成迁移时,出现以下错误:

无法确定一对一的子/从属方 “Employee.Person”和“Person.Employee”之间的关系。到 确定关系的子/依赖方,配置 外键属性。如果这些导航不属于 相同的关系配置它们,而不指定反向。看见 更多细节


我不想使用数据注释方法来解决这个问题。

我找到了解决方案,错误在于我的
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)
    {
      ....
公共抽象类BaseMap:IEntityTypeConfiguration其中T:BaseEntity
{
公共虚拟空间配置(EntityTypeBuilder)
{
HasKey(x=>x.Id);
}
}
公共抽象类ChildBaseMap:BaseMap,其中T:ChildBaseEntity
{
public virtual void Configure(EntityTypeBuilder)//x.BaseId.IsRequired();
}
}
公共类PersonMap:ChildBaseMap
{
公共覆盖无效配置(EntityTypeBuilder)
{
....

只要
覆盖
配置方法,而不是在
ChildBaseMap
类中将其定义为
virtual
,就可以解决问题!

您不需要主键来建立一对一关系流畅的配置就是它应该的样子。异常表明
Configure
方法很可能不是调用(我不喜欢单独的实体类型配置类的原因之一)。@VahidFarahmandian总是有一些解释,除非你遇到了EF核心错误,这里不是这样。我有一个干净的项目,我在那里验证帖子,所以我所能做的就是确认你的模型(帖子中的方式)调用fluent代码时工作正常,当关系配置被注释掉时,会生成确切的异常。@IvanStoev是的,您是对的,它在一个干净的项目中工作!问题在其他地方,我应该找到它!@IvanStoev感谢您的提示,我已经找到了问题,解决了问题并发布了解决方案。