使用Fluent API的EF外键

时间:2014-01-20 08:36:57

标签: c# entity-framework

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

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之间选择是非常困惑的。如果你能用简单的话来形容它,我会很高兴的。感谢。

2 个答案:

答案 0 :(得分:23)

这一行:

  

public int VehicleId {get;组; }

告诉EF,through code-conventions,您希望Driver中的外键指向Vehicle

以下是告诉EF你想要DriverVehicle的1:1关系:

  

公共虚拟车辆车辆{获取;组; }

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

关于WithRequiredPrincipalWithRequiredDependent

您正在指定VehicleDriver之间的强制关系,导航从VehicleDriver,因此:车辆1 - &gt; 1 Driver

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

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

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

Vehicle是主体,Driver是主体,因为导航属性位于指向Driver的{​​{1}}中。)

这两个是类似的:

Vehicle

答案 1 :(得分:3)

EF会创建Vehicle_VehicleId列,因为您的VehicleId实体上有VehicleDriver

VehicleId实体中删除VehicleDriver

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;