事情是这样的:
我怎么会写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