2011-09-21 113 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

我通常所做的就是使用键字段并将其放入我保存的对象中。但是,当您同时修改多个新对象时,这不起作用。