エンティティフレームワークのストアドプロシージャマッピング機能を使用して、挿入更新と削除機能を実行しようとしています。asp.net MVCを使用してEntityフレームワークで呼び出されないストアドプロシージャMVC
何らかの理由でプロシージャが呼び出されていないためです。それらは正しくマッピングされていると思われます。私がしなければならないことは、コントローラーでSaveChanges();
を呼び出すことです。
this tutorialを参考にして、コントローラーの編集部分を変更してストアードプロシージャーを使用することはできますか?
チュートリアルコード:
//
// 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();
}
}
}
私はちょうど更新SPROC SaveChanges();
を呼び出すことによって、私はちょうどそのようApplyPropertyChanges();
への呼び出しを削除更新するだろうと考えた:
//
// 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();
}
}
}
更新ストアドプロシージャは、」doesnのしかし、私は実行するSQLプロファイラを実行していることを確認します。
プログラミングEntity Frameworkのブックチュートリアルは発言として引用されています。
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.
だから、私は私がここでかなり何かを明らかに不足しています把握します。
編集は、ここで私は今で働いている正確なバージョンがあり、名前が異なっている:
//
// 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;
}
}
}
}
これは、構造体のチュートリアルのコードとほとんど同じに見えますが、実行時にNullReference例外がスローされます。
返信いただきありがとうございます。私は上記のコードを、上記のチュートリアルに基づいて現在使用している正確なバージョンで更新しました。
ApplyPropertyChanges();
コールを入れると、NullReference例外が発生します。 –実際にはデータベースから元のエンティティを取得していることを確認しましたか? FirstOrDefaultはnullを返すことができます。 1つしかない場合はSingle()に変更することができます。何も見つからなかった場合、または複数が見つかった場合は、例外が強制されます。 – tvanfosson
ああ、それが問題だった。私はIDを返すのを忘れていたので、nullを返していました。ご助力ありがとうございます。 –