2011-09-21 88 views
0

我試圖使用Entity Framework 4.0添加和刪除多對多關係的記錄。我瀏覽過網頁,但沒有找到有意義的例子。使用多對多關係添加/刪除數據

作爲一個例子,假設我有一個Drivers and Vehicles表和一個聯結表VehicleDrivers。

驅動程序

  • DriverID
  • ...

車輛

  • VehicleID
  • ...

VehicleDrivers

  • DriverID
  • VehicleID

我的問題是:

  1. 我怎麼會寫EF語句添加新的車輛和相關的驅動程序?
  2. 如何編寫EF語句以刪除現有車輛和任何相關驅動程序?

感謝您的任何提示。

回答

1

事情是這樣的:

我怎麼會寫EF語句添加新的車輛和相關 驅動?

對於現有的驅動程序:

using (var context = new MyContext(...)) 
{ 
    var newVehicle = new Vehicle { ... }; 
    var existingDriver = context.Drivers.First(d => d.Name == "Jim"); 
    newVehicle.Drivers.Add(existingDriver); 

    context.Vehicles.AddObject(newVehicle); 

    context.SaveChanges(); 
} 

對於新的驅動程序:

using (var context = new MyContext(...)) 
{ 
    var newVehicle = new Vehicle { ... }; 
    var newDriver = new Driver { ... }; 
    newVehicle.Drivers.Add(newDriver); 

    context.Vehicles.AddObject(newVehicle); 

    context.SaveChanges(); 
} 

我怎麼會寫EF語句刪除現有的車輛和任何 相關的驅動程序?

using (var context = new MyContext(...)) 
{ 
    var existingVehicle = context.Vehicles.First(v => v.Name == "Ford"); 

    context.Vehicles.DeleteObject(existingVehicle); 

    context.SaveChanges(); 
} 

沒有更多的在這裏做的,因爲與鏈接到刪除的車輛,所有司機的連接表中的相關條目將被刪除,以及因啓用級聯刪除數據庫中。

編輯

如果你想在你需要先檢查驅動程序沒有鏈接到其他車輛上的許多一對多的關係,刪除驅動程序以及(而不僅是鏈接) :

using (var context = new MyContext(...)) 
{ 
    var existingVehicle = context.Vehicles.Include("Drivers") 
     .First(v => v.Name == "Ford"); 

    foreach(var driver in existingVehicle.Drivers.ToList()) 
    { 
     if (!context.Drivers.Any(d => d.DriverId == driver.DriverId 
      && d.Vehicles.Any(v => v.VehicleId != existingVehicle.VehicleId))) 
      context.Drivers.DeleteObject(driver); 
    } 
    context.Vehicles.DeleteObject(existingVehicle); 

    context.SaveChanges(); 
} 
+0

那麼,看看只是刪除代碼,它會級聯到聯結表,但刪除聯結表將不會級聯到驅動程序表。事實上,駕駛員有可能與其他車輛相關聯,因此級聯刪除車輛以刪除所有相關駕駛員是沒有意義的。 –

+0

@Jonathan:大聲笑,我只是添加另一個例子,你還想刪除驅動程序。但正如你所說,在大多數情況下,在多對多關係中,這沒有多大意義。但是,通過上面的示例中的檢查,它至少可以工作。 – Slauma

0

我通常所做的就是使用鍵字段並將其放入我保存的對象中。但是,當您同時修改多個新對象時,這不起作用。