Donc j'ai ce projet de démo presque entièrement fonctionnel.
public class Project
{
public int ID { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection Tasks { get; set; }
}
public class Task
{
public int ID { get; set; }
[Required]
public string Name { get; set; }
public int ProjectID { get; set; }
public virtual Project Project { get; set; }
}
Contrôleur
public ActionResult Edit(int id)
{
var project = db.Projects.Where(p=>p.ID==id).Single();
return View(project);
}
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
var dbProject = db.Projects.Where(p => p.ID == project.ID).Single();
UpdateModel(dbProject);
db.SaveChanges();
TempData["Success"] = "Modèle Valide";
}
return RedirectToAction("Index");
}
Vue//fortement typée pour le projet
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
Project
@Html.HiddenFor(model => model.ID)
@Html.LabelFor(model => model.Name)
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
Tâches
@Html.EditorFor(m => m.Tasks)
}
Modèle d'Éditeur
@model MvcApplication2.Models.Task
Tâche
@Html.LabelFor(m => m.Name)
@Html.EditorFor(m => m.Name)
@Html.HiddenFor(m => m.ID)
@Html.HiddenFor(m => m.ProjectID)
@Html.ValidationMessageFor(m => m.Name)
La vue affiche cela
Le problème est que lorsque je soumets le formulaire, les Tâches sont remplies avec tout sauf la propriété virtuelle Project... donc l'erreur que je reçois est
L'opération a échoué : La relation n'a pas pu être modifiée car l'une ou plusieurs des propriétés de clé étrangère sont non nullables. Lorsqu'une modification est apportée à une relation, la propriété de clé étrangère associée est définie sur une valeur nulle. Si la clé étrangère ne supporte pas les valeurs nulles, une nouvelle relation doit être définie, la propriété de clé étrangère doit se voir assigner une autre valeur non nulle, ou l'objet non lié doit être supprimé.
Voici une capture d'écran du résultat de mon point d'arrêt de débogage
S'il vous plaît Aidez-moi.
MISE À JOUR :
J'ai changé mon action de contrôleur comme ceci
[HttpPost]
public ActionResult Edit(Project project)
{
if (ModelState.IsValid)
{
db.Entry(project).State = EntityState.Modified;
db.SaveChanges();
TempData["Success"] = "Modèle Valide";
return RedirectToAction("Index");
}
return View(project);
}
cela ne fonctionne toujours pas correctement. Maintenant, les changements apportés au Nom du projet sont mis à jour correctement dans la base de données. mais les changements apportés à n'importe quel Nom de Tâche sont complètement ignorés.