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 ......
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