使用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,你想要从Driver
到Vehicle
的1:1关系:
公共虚拟车辆车辆{get; 组; }
您应该删除它们并坚持使用Fluent API配置。
关于WithRequiredPrincipal与WithRequiredDependent :
您正在指定Vehicle
和Driver
之间的强制关系,从Vehicle
导航到Driver
,因此:车辆1 – > 1 Driver
(由于导航属性位于Vehicle
并指向Driver
,因此Vehicle是主体, Driver
是依赖的。)
modelBuilder.Entity() .HasRequired(d => d.Driver) .WithRequiredDependent();
您正在指定Vehicle
和Driver
之间的强制关系,从Driver
到Vehicle
导航,因此: 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
实体上有VehicleId
和Vehicle
。
从您的Driver
实体中删除VehicleId
和Vehicle
:
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;