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