私は、ドライバの作成時に多くの多くの車両をドライバに割り当てることができ、しかし、私はレコードを編集し、更新したいとき、私は車のNULLのコレクションを取得しています、ここで多対多リレーションシップのエントリを更新した後、EF MVC4が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; }
}
とは、ドライバの編集(ある)コントローラーアクション:
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コレクションが含まれています。 ..助けてください......
Thanks @ kettch、あなたは素晴らしいです、私は前にlazyloadingを使用していましたが、それは正常に動作していませんでした... Eager Loadingは正常に動作しています、もう一度ありがとう...... – mubsher