【问题标题】:EF MVC4 returning null after updating entries in many to many relationshipEF MVC4 在更新多对多关系中的条目后返回 null
【发布时间】:2017-08-23 18:14:25
【问题描述】:

我有黑白司机和车辆实体的多对多关系,在创建司机时,可以将许多车辆分配给司机,它工作正常,但是当我想编辑和更新记录时,我得到了null 车辆集合,

这是我的模型:

 public class Driver {
   public int driverId {get;set;}
   public string Name {get;set;}
   public virtual ICollection<Vehicle> Vehicles {get;set;}
 } 
 public class Vehicle {
   public int Vehicle_Id {get;set;}
   public string Vehicle_Type_Name {get;set;}
   public virtual ICollection<Driver> Drivers {get;set;}
 } 

我在这里定义关系:

   modelBuilder
    .Entity<Driver>()
    .HasMany<Vehicle>(d => d.Vehicles)
    .WithMany(d => d.Drivers).Map(
  cs =>
   {                   
      cs.MapLeftKey("DriverId")
      .MapRightKey("VehicleId")
      .ToTable("DriversVehicles");
   });

还有我的司机查看模型

public class DriverViewModel
{
    public DriverViewModel()
    {
        SelectedVehicles=new List<int>();
        VehicleList = new List<Vehicle>();
    }

    public Driver driver { get; set; }
    public List<int> SelectedVehicles { get; set; }
    public List<Vehicle> VehicleList { get; set; }
}

这里是驱动 Edit() 控制器动作:

    public ActionResult Edit(int id = 0)
    {
        DriverViewModel DriverVm = new DriverViewModel();


        var list = db.vehicles.Select(
        v => new { v.Vehicle_Id,v.Vehicle_Type_Name }).ToList();
        DriverVm.driver = db.drivers.Find(id);

        foreach (var item in list)
        {
            DriverVm.VehicleList.Add(new Vehicle { Vehicle_Id = item.Vehicle_Id, Vehicle_Type_Name = item.Vehicle_Type_Name });
        }
        foreach (var item in DriverVm.driver.Vehicles)
        {
            DriverVm.SelectedVehicles.Add(item.Vehicle_Id);
        }

        return View(DriverVm);
    }

这是用于编辑的 POST 操作:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(DriverViewModel driverVm)
    {
        var list = db.vehicles.Select(v =>
            new { v.Vehicle_Id, v.Vehicle_Type_Name }).ToList();

        foreach (var item in list)
        {
            driverVm.VehicleList.Add(
         new Vehicle { 
             Vehicle_Id = item.Vehicle_Id, 
             Vehicle_Type_Name = item.Vehicle_Type_Name 
        });
        }

        if (ModelState.IsValid)
        {
            db.Entry(driverVm.driver).State = EntityState.Modified;
            db.SaveChanges();

            List<Vehicle> vhcls = new List<Vehicle>();

            Driver driver = db.drivers.Find(driverVm.driver.driverId);
            vhcls = driver.Vehicles.ToList();

            foreach (Vehicle veh in vhcls)
            {
                driver.Vehicles.Remove(veh);
            }
            db.SaveChanges();

            foreach (var item in driverVm.SelectedVehicles)
            {
               Vehicle vehicle = db.vehicles.Find(item);
               driverVm.driver.Vehicles.Add(vehicle);
            }
            db.SaveChanges();

            TempData["DriverSuccess"] = "1";
            return RedirectToAction("Edit");
        }
        else
        {
            ViewBag.DriverError = "1";
        }
        return View(driverVm);
    }

真正的问题在这里:

        Driver driver = db.drivers.Find(driverVm.driver.driverId);
        vhcls = driver.Vehicles.ToList();

        foreach (Vehicle veh in vhcls)
        {
            driver.Vehicles.Remove(veh);
        }
        db.SaveChanges()

上面代码中的列表“vhcls”是空的,它应该包含与驱动程序关联的车辆,但是“驱动程序”对象包含“driverVm.driver.Vehicles”中的Null集合而不是关联车辆,我在徘徊不好但找不到解决方案..请帮助......

【问题讨论】:

    标签: c# linq asp.net-mvc-4 entity-framework-6


    【解决方案1】:

    仅使用find 不会包含相关实体。很可能驱动程序包含正确的实体,但 Vehicles 集合为空。

    尝试使用Include 确保包含相关实体,并尝试使用FirstOrDefault 模拟Find 的结果。

    Driver driver = db.drivers
        .Include(d => d.Vehicles)
        .FirstOrDefault(d => d.Id == driverVm.driver.driverId);
    
    vhcls = driver.Vehicles.ToList();
    

    编辑:我最初错过了您已经在使用延迟加载,所以我稍微调整了答案。

    【讨论】:

    • 谢谢@kettch,你太棒了,我之前一直在使用延迟加载,但它不能正常工作...急切加载工作正常,再次感谢......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多