2014-01-20 83 views
8

以下是我的模型。我有車輛和駕駛員的一對一映射。我將首先創建車輛,然後將駕駛員映射到車輛。使用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。

我已經寫了下面流利的API代碼:

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

但它會在驅動程序表中的新列 - Vehicle_VehicleId並將其映射到車輛上表中VehicleId。我需要Driver表的VehicleId來映射。

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

+2

你可以把家屬和校長實體框架的問你:「如果你想插入這些表的記錄,我應該在哪裏插入記錄,表A或表B?如果選擇表A作爲主體,則表B將包含表A的外鍵.Fluent API具有優秀的c#文檔,您應該仔細閱讀「WithRequiredDependent」和「WithRequiredPrincipal」的描述。 – Moeri

回答

18

這條線:

公衆詮釋VehicleId {獲得;組; }

告訴EF,through code-conventions,要在Driver一個外鍵指向Vehicle

這一個是說,你想有一個1告訴EF:從DriverVehicle 1的關係:

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

你應該刪除兩者並堅持你的Fluent API配置。

關於WithRequiredPrincipalWithRequiredDependent

要指定VehicleDriver之間強制關係,具有導航從VehicleDriver,從而:車輛1 - > 1 Driver

(車輛是主要的和Driver從屬,由於導航酒店位於Vehicle指着Driver。)

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

您指定的強制性關係b切口白內障手術挽VehicleDriver,從DriverVehicle導航,從而: - 1 Driver

Vehicle是相關的,並且Driver本金,由於導航屬性位於Driver指向Vehicle

這兩個類似於:

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

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

非常好的解釋。謝謝。 –

3

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; 
+0

我已將其刪除,但它仍會創建Vehicle_VehicleId。不是驅動程序表中的VehicleId。 –

+0

這是因爲你使用流利的api來定義關係。我已經更新了我的答案。也刪除虛擬屬性。 –

相關問題