簡體   English   中英

使用Fluent API的EF外鍵

[英]EF Foreign Key using Fluent API

這是我的模特。 我有一對一的車輛和司機映射。 我將首先創建車輛,然后將駕駛員映射到車輛。

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的Driver表來映射。

此外,我是EF和Fluent API的新手。 我發現在WithRequiredDependent和WithRequiredPrincipal之間選擇是非常困惑的。 如果你能用簡單的話來形容它,我會很高興的。 謝謝。

這一行:

public int VehicleId {get; 組; }

通過代碼約定告訴EF您希望Driver的外鍵指向Vehicle

以下是告訴EF你想要從DriverVehicle的1:1關系:

公共虛擬車輛車輛{獲取; 組; }

您應該刪除它們並堅持使用Fluent API配置。

關於WithRequiredPrincipalWithRequiredDependent

您正在指定VehicleDriver之間的強制關系,從Vehicle導航到Driver ,因此:車輛1 - > 1 Driver

(由於導航屬性位於Vehicle並指向Driver ,因此Vehicle是主體, Driver是依賴的。)

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

您正在指定VehicleDriver之間的強制關系,從DriverVehicle導航,因此: Vehicle 1 < - 1 Driver

Vehicle是依賴項, Driver是principal,因為導航屬性位於Driver指向Vehicle 。)

這兩個是類似的:

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

modelBuilder.Entity<Driver>()
            .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<Vehicle>()
        .HasRequired(d => d.Driver)
        .WithRequiredPrincipal();

您正在設置關系,因此無需在實體類中包含手動屬性。

您從導航屬性Vehicle獲取VehicleId

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM