添加/删除具有多对多关系的数据

时间:2011-09-21 15:37:40

标签: c# entity-framework many-to-many

我正在尝试使用Entity Framework 4.0添加和删除具有多对多关系的记录。我已经在网上搜索过,但我找不到一个有意义的例子。

举个例子,假设我有一个带有联结表VehicleDrivers的驾驶员和车辆表。

驱动

  • DriverID
  • ...

车辆

  • VehicleID
  • ...

VehicleDrivers

  • DriverID
  • VehicleID

我的问题是:

  1. 如何编写EF语句以添加新车辆及相关驱动程序?
  2. 如何编写EF语句来删除现有车辆及相关驱动程序?
  3. 感谢您的任何提示。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

我通常使用的是关键字段并将其放入我正在保存的对象中。但是,当您同时修改几个新对象时,这不会很好。