2017-08-23 5 views
0

J'ai une relation de beaucoup à beaucoup de conducteurs de b/w et entité de véhicule, au moment de la création du conducteur, de nombreux véhicules peuvent être assignés à un conducteur, ça fonctionne bien mais quand je veux éditer et mettre à jour les dossiers que je reçois une collection nulle de véhicules,EF MVC4 retournant null après la mise à jour des entrées dans plusieurs à plusieurs relations

Voici mes modèles:

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;} 
} 

ici, je définir la relation:

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

Et mon chauffeur Voir modèle

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; } 
} 

Et voici pilote Edit() Action Controller:

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

Et voici l'action POST pour modifier:

[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); 
    } 

Le problème réel est ici :

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

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

La liste "vhcls "dans le code ci-dessus est vide, il doit contenir les véhicules associés aux pilotes, mais objet" pilote "contient Null collection dans" driverVm.driver.Vehicles "au lieu d'avoir des véhicules associés, je suis errant mal, mais ne trouve pas la solution ..S'il vous plaît aider ......

Répondre

1

Juste en utilisant find n'inclura pas les entités liées. Il est très probable que le pilote contienne la bonne entité, mais que la collection Véhicules est vide. Essayez d'utiliser Include pour vous assurer que les entités associées seront incluses, et FirstOrDefault pour émuler le résultat Find.

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

vhcls = driver.Vehicles.ToList(); 

Edit: J'ai d'abord manqué que vous utilisiez déjà en cours de chargement Lazy, donc j'ajusté la réponse un peu.

+0

Merci @ kettch, Vous êtes génial, j'ai utilisé la lazyloading avant, mais ça ne fonctionnait pas bien ... Chargement impatient fonctionne bien, merci encore ...... – mubsher