2017-08-23 3 views
0

私は、ドライバの作成時に多くの多くの車両をドライバに割り当てることができ、しかし、私はレコードを編集し、更新したいとき、私は車の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コレクションが含まれています。 ..助けてください......

答えて

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(); 

編集:私は当初、すでに遅延ロードを使用していたことを逃したので、私は答えを少し調整し

+0

Thanks @ kettch、あなたは素晴らしいです、私は前にlazyloadingを使用していましたが、それは正常に動作していませんでした... Eager Loadingは正常に動作しています、もう一度ありがとう...... – mubsher

関連する問題