C# EF MVC4在更新多对多关系中的条目后返回null
我与驾驶员和车辆实体有多对多关系,在创建驾驶员时,可以将许多车辆分配给驾驶员,这很好,但当我想要编辑和更新记录时,我得到的车辆集合为空 以下是我的模型:C# EF MVC4在更新多对多关系中的条目后返回null,c#,linq,asp.net-mvc-4,entity-framework-6,C#,Linq,Asp.net Mvc 4,Entity Framework 6,我与驾驶员和车辆实体有多对多关系,在创建驾驶员时,可以将许多车辆分配给驾驶员,这很好,但当我想要编辑和更新记录时,我得到的车辆集合为空 以下是我的模型: public class Driver { public int driverId {get;set;} public string Name {get;set;} public virtual ICollection<Vehicle> Vehicles {get;set;} } public class
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;}
}
下面是编辑的后期操作:
[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);
}
上述代码中的列表“vhcls”为空,它应该包含与驾驶员关联的车辆,但“driver”对象在“driverVm.driver.vehicles”中包含空集合,而不包含关联的车辆,我漫游得很糟糕,但找不到解决方案..请帮助..仅使用
查找将不包括相关实体。很可能driver包含正确的实体,但Vehicles集合为空
尝试使用Include
确保相关实体将被包括,并使用FirstOrDefault
模拟Find
的结果
Driver driver = db.drivers
.Include(d => d.Vehicles)
.FirstOrDefault(d => d.Id == driverVm.driver.driverId);
vhcls = driver.Vehicles.ToList();
编辑:我最初没有注意到您已经在使用惰性加载,所以我对答案进行了一些调整。谢谢@kettch,您太棒了,我以前一直在使用惰性加载,但效果不好……急切加载很好,再次感谢。。。。。。
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);
}
[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()
Driver driver = db.drivers
.Include(d => d.Vehicles)
.FirstOrDefault(d => d.Id == driverVm.driver.driverId);
vhcls = driver.Vehicles.ToList();