EF Core-创建两个映射到单个逆属性的导航属性

时间:2018-11-20 00:11:46

标签: c# .net entity-framework ef-core-2.1

我设置了以下实体。

public class Car
{
    public int Id { get; protected set; }
    public HashSet<Wheel> FrontWheels { get; set; };
    public HashSet<Wheel> RearWheels { get; set; };
}

public class Wheel
{
    public int Id { get; protected set; }
    //public Car Car { get; set; }
    public double Diameter { get; set; }
    public double Width { get; set; }
}

一辆汽车有轮子。它与正面和背面的相互作用非常不同,因此它们存放在不同的集合中。车轮本身既不是前轮也不是后轮(可以是前轮或后轮),只有通过与汽车的关联,车轮才能在汽车上获得位置。

我可以使用以下配置在EF Core 2.1中进行设置:

    modelBuilder.Entity<Car>().HasMany(car => car.FrontWheels).WithOne();
    modelBuilder.Entity<Car>().HasMany(car => car.RearWheels).WithOne();

这将创建一个带有两个可为空的fk列,即CarIdFrontWheel和CarIdRearWheel的Wheel表。我知道为什么会创建两列以及为什么它们可以为空(每个Wheel行仅填充1 fk列,并且该列描述了汽车上的位置)。这种模式描述了这种情况,对此我感到满意。

现在,当我想重新添加注释掉的反向导航属性时,问题就开始了,这样我就可以从Wheel导航到与其相连的Car。但是,我配置了它,EF始终希望将另一个名为CarId的fk添加到Wheel表中,以映射回Car。我了解为什么需要这样做-否则,我试图让一个属性(Wheel.Car)参与两种关系。两个fks可能指向不同的Car ID,等等。

但是,从实体关系的角度来看,我要问的似乎在逻辑上是合理的。如果我们是手动编写此数据访问权限,则可以使模式正常工作而无需此不必要的(有些非规范化的)第三外键。

  • 是否可以仅使用两个配置这些实体 (CarIdFrontWheel和CarIdRearWheel)外键?
  • 我应该只接受存在CarId外键吗?
  • 或者,我可以对模型进行一些更改以帮助解决这种情况吗?

0 个答案:

没有答案