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

C# 添加/删除具有多对多关系的数据,c#,entity-framework,many-to-many,C#,Entity Framework,Many To Many,我正在尝试使用EntityFramework4.0添加和删除具有多对多关系的记录。我在网上搜索过,但没有找到一个有意义的例子 例如,假设我有一个Drivers and Vehicles表和一个junction表VehicleDrivers 司机 胡闹 车辆 车辆ID 车流 胡闹 车辆ID 我的问题是: 如何编写EF语句来添加新车和相关驾驶员 如何编写EF声明来删除现有车辆和任何相关驾驶员 谢谢你的提示。我通常会使用key字段并将其放入我正在保存的对象中。但是,当您同时修改多个新对

我正在尝试使用EntityFramework4.0添加和删除具有多对多关系的记录。我在网上搜索过,但没有找到一个有意义的例子

例如,假设我有一个Drivers and Vehicles表和一个junction表VehicleDrivers

司机

  • 胡闹
车辆

  • 车辆ID
车流

  • 胡闹
  • 车辆ID
我的问题是:

  • 如何编写EF语句来添加新车和相关驾驶员
  • 如何编写EF声明来删除现有车辆和任何相关驾驶员

  • 谢谢你的提示。

    我通常会使用key字段并将其放入我正在保存的对象中。但是,当您同时修改多个新对象时,此操作不起作用。

    类似以下内容:

    我如何编写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.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:Lol,我只是为您还想删除驾驶员的案例添加了另一个示例。但正如你所说,在大多数情况下,在多对多关系中,这没有多大意义。但是,通过上面示例中的检查,它至少会起作用。
    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();
    }