使用Fluent API的EF外键

Ash*_*ran 11 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; }
}
Run Code Online (Sandbox Code Playgroud)

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

我编写了以下Fluent API代码:

modelBuilder.Entity<Vehicle>()
            .HasRequired(d => d.Driver)
            .WithRequiredPrincipal();
Run Code Online (Sandbox Code Playgroud)

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

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

jno*_*ovo 23

这一行:

public int VehicleId {get; 组; }

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

下面告诉你想要一个1 EF:1关系DriverVehicle:

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

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

关于WithRequiredPrincipalWithRequiredDependent:

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

(车辆是主要和Driver依赖,因为导航属性位于Vehicle并指向Driver.)

modelBuilder.Entity<Vehicle>()
            .HasRequired(d => d.Driver)
            .WithRequiredDependent();
Run Code Online (Sandbox Code Playgroud)

要指定之间的强制关系VehicleDriver,具有导航从DriverVehicle,从而:Vehicle1 < - 1Driver

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

这两个是类似的:

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

modelBuilder.Entity<Driver>()
            .HasRequired(d => d.Vehicle)
            .WithRequiredDependent();
Run Code Online (Sandbox Code Playgroud)