这是我的模特。我有一对一的车辆和司机映射。我将首先创建车辆,然后将驾驶员映射到车辆。
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<Vehicle>()
.HasRequired(d => d.Driver)
.WithRequiredPrincipal();
但它在Drivers表中创建了一个新列 - Vehicle_VehicleId并将其映射到Vehicle表上的VehicleId。我希望将VehicleId of Driver表映射。
此外,我是EF和Fluent API的新手。我发现在WithRequiredDependent和WithRequiredPrincipal之间选择是非常困惑的。如果你能用简单的话来形容它,我会很高兴的。感谢。
答案 0 :(得分:23)
这一行:
public int VehicleId {get;组; }
告诉EF,through code-conventions,您希望Driver
中的外键指向Vehicle
。
以下是告诉EF你想要Driver
到Vehicle
的1:1关系:
公共虚拟车辆车辆{获取;组; }
您应该删除它们并坚持使用Fluent API配置。
关于WithRequiredPrincipal与WithRequiredDependent:
您正在指定Vehicle
和Driver
之间的强制关系,导航从Vehicle
到Driver
,因此:车辆1 - &gt; 1 Driver
(Vehicle是主体,Driver
依赖,因为导航属性位于Vehicle
并指向Driver
。)
modelBuilder.Entity<Vehicle>()
.HasRequired(d => d.Driver)
.WithRequiredDependent();
您正在指定Vehicle
和Driver
之间的强制关系,导航从Driver
到Vehicle
,因此:Vehicle
1&lt; - 1 Driver
(Vehicle
是主体,Driver
是主体,因为导航属性位于指向Driver
的{{1}}中。)
这两个是类似的:
Vehicle
答案 1 :(得分:3)
EF会创建Vehicle_VehicleId
列,因为您的VehicleId
实体上有Vehicle
和Driver
。
从VehicleId
实体中删除Vehicle
和Driver
:
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<Vehicle>()
.HasRequired(d => d.Driver)
.WithRequiredPrincipal();
您正在设置关系,因此无需在实体类中包含手动属性。
您从导航属性VehicleId
获得Vehicle
:
IQueryable<int> vehicleIds = context.Drivers.Select(x => x.Id == 123).Vehicles.Id;