2009-06-26 8 views
1

J'essaie d'utiliser la fonction de mappage de procédure stockée dans Entity Framework pour exécuter les fonctions de mise à jour et de suppression d'insertion.Procédures stockées non appelées dans Entity Framework à l'aide d'asp.net MVC

Pour une raison quelconque, les procédures ne sont pas appelées. Ils sont correctement mappés, et supposément tout ce que j'ai à faire est d'appeler SaveChanges(); dans mon contrôleur pour qu'ils s'exécutent.

En utilisant this tutorial comme référence, qu'est-ce que je changerais à propos de la partie Edit du contrôleur pour qu'il utilise la procédure stockée?

Code Tutoriel:

// 
// GET: /Home/Edit/5 

public ActionResult Edit(int id) 
{ 
    var contactToEdit = (from c in _entities.ContactSet 
         where c.Id == id 
         select c).FirstOrDefault(); 

    return View(contactToEdit); 
} 

// 
// POST: /Home/Edit/5 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Contact contactToEdit) 
{ 
    if (!ModelState.IsValid) 
     return View(); 

    try 
    { 
     var originalContact = (from c in _entities.ContactSet 
          where c.Id == contactToEdit.Id 
          select c).FirstOrDefault(); 
     _entities.ApplyPropertyChanges(originalContact.EntityKey.EntitySetName, contactToEdit); 
     _entities.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 
} 

Je pensais que tout en appelant SaveChanges(); la sproc mise à jour mettra à jour si je viens retiré l'appel à ApplyPropertyChanges(); comme ceci:

// 
// POST: /Home/Edit/5 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(Contact contactToEdit) 
{ 
    if (!ModelState.IsValid) 
     return View(); 

    try 
    { 
     _entities.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    catch 
    { 
     return View(); 
    } 
} 
} 

La mise à jour procédure stockée n » t exécuter cependant, j'ai sql profiler en cours d'exécution pour s'assurer.

Entity Framework de programmation tutoriels livre sont cités comme disant:

Now that the stored procedures have been mapped, it is not necessary to call them directly in code. Any time SaveChanges is called, Entity Framework will use your mapped stored procedures for any required inserts, updates and deletes.

Alors, je me dis que je me manque quelque chose ici assez évident.

Edition, voici la version exacte, je travaille avec maintenant, les noms sont différents:

// 
    // GET: /Candidate/Edit/5 

    public ActionResult Edit(int id) 
    { 
     var candidateToEdit = (from c in Internship.CompleteCandidate 
           where c.UserID == id 
           select c).FirstOrDefault(); 
     //ViewData["EducationID"] = new SelectList(Internship.education.ToList(), "ID", "Category", candidateToEdit.EducationID); 
     return View(candidateToEdit); 
    } 

    // 
    // POST: /Candidate/Edit/5 

    [AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Edit(CompleteCandidate candidateToEdit) 
    { 
     if (!ModelState.IsValid) 
      return View(); 

     try 
     { 
      var originalCandidate = (from c in Internship.CompleteCandidate 
            where c.UserID == candidateToEdit.UserID 
            select c).FirstOrDefault(); 
      Internship.ApplyPropertyChanges(originalCandidate.EntityKey.EntitySetName, candidateToEdit); 
      Internship.SaveChanges(); 
      return RedirectToAction("Index"); 
     } 
     catch(Exception e) 

     { 
      Response.Write("Error: " + e); 
      //return View(); 
      return null; 
     } 

    } 

} 
} 

Il semble presque identique au code de tutoriel dans la structure mais Déclenche une exception NullReference lors de l'exécution.

Répondre

1

Le problème dans votre exemple est que l'entité de contact reçue en tant que paramètre n'est pas associée au contexte de données. Ainsi, lorsque SaveChanges est appelé, il n'y a rien à mettre à jour. Généralement lors de la mise à jour, j'utilise l'identifiant fourni et j'obtiens l'entité d'origine de la base de données et je lui applique les modifications. Lorsque vous faites cela, SaveChanges devrait invoquer votre procédure stockée sur l'entité avec ses changements.

Remettre dans le code pour récupérer l'entité d'origine et lui appliquer les modifications.

+0

Merci pour la réponse, j'ai mis à jour le code ci-dessus avec la version exacte que j'utilise actuellement basée sur le tutoriel ci-dessus. Lorsque j'appelle l'appel ApplyPropertyChanges();, j'obtiens une exception NullReference. –

+1

Avez-vous vérifié que l'entité d'origine provient bien de la base de données? FirstOrDefault peut renvoyer null. Vous pourriez vouloir le changer en Single() s'il n'y en a qu'un. Cela forcerait une exception si aucune d'entre elles n'était trouvée ou si plus d'une était trouvée. – tvanfosson

+0

Ah oui, c'était le problème. J'ai oublié de repasser la pièce d'identité pour qu'elle revienne nulle. Merci beaucoup pour votre aide. –

0

Il se peut que la procédure stockée de mise à jour ne soit pas en cours d'exécution car aucune modification ne doit être conservée.

Questions connexes