使用Fluent API的EF外键

这是我的模特。 我有一对一的车辆和司机映射。 我将首先创建车辆,然后将驾驶员映射到车辆。

public class Driver { public int Id { get; set; } public String Name { get; set; } public int VehicleId { get; set; } public virtual Vehicle Vehicle { get; set; } } public class Vehicle { public int Id { get; set; } public String Name { get; set; } public virtual Driver Driver { get; set; } public int VehicleGroupId { get; set; } public virtual VehicleGroup Vehicles { get; set; } } 

我想在Driver类中使用VehicleId属性来保持驱动程序正在驱动的车辆ID。

我编写了以下Fluent API代码:

 modelBuilder.Entity() .HasRequired(d => d.Driver) .WithRequiredPrincipal(); 

但它在Drivers表中创建了一个新列 – Vehicle_VehicleId并将其映射到Vehicle表上的VehicleId。 我想要VehicleId的Driver表来映射。

此外,我是EF和Fluent API的新手。 我发现在WithRequiredDependent和WithRequiredPrincipal之间选择是非常困惑的。 如果你能用简单的话来形容它,我会很高兴的。 谢谢。

这一行:

public int VehicleId {get; 组; }

通过代码约定告诉EF您希望Driver的外键指向Vehicle

这个告诉EF,你想要从DriverVehicle的1:1关系:

公共虚拟车辆车辆{get; 组; }

您应该删除它们并坚持使用Fluent API配置。

关于WithRequiredPrincipal与WithRequiredDependent :

您正在指定VehicleDriver之间的强制关系,从Vehicle导航到Driver ,因此:车辆1 – > 1 Driver

(由于导航属性位于Vehicle并指向Driver ,因此Vehicle是主体, Driver是依赖的。)

 modelBuilder.Entity() .HasRequired(d => d.Driver) .WithRequiredDependent(); 

您正在指定VehicleDriver之间的强制关系,从DriverVehicle导航,因此: Vehicle 1 < - 1 Driver

Vehicle是依赖项, Driver是principal,因为导航属性位于Driver指向Vehicle 。)

这两个是类似的:

 modelBuilder.Entity() .HasRequired(v => v.Driver) .WithRequiredPrincipal(); modelBuilder.Entity() .HasRequired(d => d.Vehicle) .WithRequiredDependent(); 

EF会创建Vehicle_VehicleId列,因为您的Driver实体上有VehicleIdVehicle

从您的Driver实体中删除VehicleIdVehicle

 public class Driver { public int Id { get; set; } public String Name { get; set; } } public class Vehicle { public int Id { get; set; } public String Name { get; set; } } 

使用:

 modelBuilder.Entity() .HasRequired(d => d.Driver) .WithRequiredPrincipal(); 

您正在设置关系,因此无需在实体类中包含手动属性。

您从导航属性Vehicle获取VehicleId

 IQueryable vehicleIds = context.Drivers.Select(x => x.Id == 123).Vehicles.Id;