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