2010-07-17 18 views
0

J'essaie de m'instruire LINQ to SQL et j'ai décidé de faire un petit projet MVC.NET pour me mettre les pieds dans l'eau. Le problème est que je suis tombé très tôt avec l'erreur suivante. Je fais une application de golf donc j'ai configuré la base de données et j'ai fait mes classes dbml. La base de données a une table course et une table hole. Le tableau hole référence le courseId par sa clé primaire et comporte une contrainte de clé de priorité. Donc tout est assez standard.Impossible d'enregistrer les modifications apportées aux tables enfants à l'aide de LINQ to SQL qui ont des contraintes de clé étrangère

J'ai une action MVC sur mon contrôleur qui me permet d'éditer les informations de cours (nom et info trou, par exemple, par et l'indice de course, etc.)

Quand je ne le sauve après une édition Je reçois l'erreur suivante.

« Une tentative a été faite pour supprimer une relation entre un cours et un trou. Cependant, l'une des clés étrangères de la relation (Hole.CourseId) ne peut pas être réglé sur null. » J'ai débogué ceci et ne peux pas voir aucun problème.

Y at-il quelque chose que je dois faire sur la base de données pour me permettre d'éditer des tables avec des contraintes de clé étrangère?

Voici le code d'action:

[HttpPost] 
    [ValidateInput(true)] 
    public ActionResult Edit(int id, FormCollection collection) 
    { 
     var courseViewModel = new CourseViewModel { Course = _repository.GetCourse(id) }; 

     if (courseViewModel.Course == null) 
     { 
      return View("NotFound", string.Format("Course {0} Not Found", id)); 
     } 

     try 
     { 
      UpdateModel(courseViewModel); 
      _repository.SubmitChanges(); 

      return RedirectToAction("Index", "Course"); 
     } 
     catch (Exception ex) 
     { 
      ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations()); 
      ModelState.AddModelError("", ex.Message); 

      return View(courseViewModel); 
     } 
    } 

Où _repository ressemble à ceci:

namespace Web.Repository 
    { 
     public class MyRepository 
     { 
      private MyDataContext db = new MyDataContext(); 

      public void SubmitChanges() 
      { 
       db.SubmitChanges(); 
      } 

      public Course GetCourse(int id) 
      { 
       return db.Courses.SingleOrDefault(i => i.CourseId == id); 
      } 
     } 
    } 

Répondre

0

Qu'est-ce que UpdateModel faire? En supposant qu'il apporte des modifications au membre du cours sur votre modèle de vue, vous pouvez envisager une méthode de référentiel comme ceci:

public void SaveCourse(Course course) 
{ 
    db.Courses.Attach(course); 
    db.SubmitChanges(); 
} 
+0

Merci pour la réponse. UpdateModel est un appel à la méthode standard MVC Controller.UpdateModel(). Dans ce cas, il met à jour courseViewModel avec les modifications effectuées sur le client, donc change à courseViewModel.Course et courseViewModel.Course.Holes ainsi –

+0

J'ai essayé cette suggestion, mais maintenant obtenir: "Impossible de joindre une entité qui existe déjà." –

+0

Il semble donc que le contexte ne soit jamais perdu mais le UpdateModel définit votre champ FK sur null. Il peut être préférable de séparer votre modèle de vue de votre entité, de le publier dans votre modèle de vue et de faire une mise à jour explicite de votre entité récupérée avec uniquement les valeurs que vous souhaitez modifier. –