事情是這樣的:
我怎麼會寫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();
}
那麼,看看只是刪除代碼,它會級聯到聯結表,但刪除聯結表將不會級聯到驅動程序表。事實上,駕駛員有可能與其他車輛相關聯,因此級聯刪除車輛以刪除所有相關駕駛員是沒有意義的。 –
@Jonathan:大聲笑,我只是添加另一個例子,你還想刪除驅動程序。但正如你所說,在大多數情況下,在多對多關係中,這沒有多大意義。但是,通過上面的示例中的檢查,它至少可以工作。 – Slauma