Entity Frameworkを使用したAsp.net MVC 3は初めてです。
チュートリアルに従って、SQL データベースのレコードを追加/編集および削除する簡単なプログラムを作成しました。
私の質問は、重複レコードをどこでどのように防止する必要があるかです。「firstName」フィールドは一意です。では、ユーザーがフォームからレコードを追加するとき、このレコードが存在しないことをどのように制御できますか?
よろしくお願いします。
Entity Frameworkを使用したAsp.net MVC 3は初めてです。
チュートリアルに従って、SQL データベースのレコードを追加/編集および削除する簡単なプログラムを作成しました。
私の質問は、重複レコードをどこでどのように防止する必要があるかです。「firstName」フィールドは一意です。では、ユーザーがフォームからレコードを追加するとき、このレコードが存在しないことをどのように制御できますか?
よろしくお願いします。
次のようなものを記述して、受信データの既知の問題をキャッチし、データにまれな問題が発生する場合にのみ例外を発生させることができます。
public class PersonController
{
public ActionResult Add(PersonModel model)
{
if (ModelState.IsValid /* && check whether model represents valid data */)
{
try
{
// create Person record here (this logic might throw exception)
return View("AddSuccess");
}
catch (Exception exception)
{
return View("AddError", exception);
}
}
else
{
ModelState.AddModelErrors("", "description of model error found");
}
return View();
}
}
少し高度なデザインパターンを使用して、このコードを構造化するためのより良い方法がありますが、これは出発点となるはずです。
一般に、例外がスローされるのは避けたいと思います。これは、通常、誤った入力をチェックするよりも遅いためです。
if(ModelState.IsValid)
{
if(db.A.Any(ac=>ac.Name.Equals(a.Name)))
{
return;
}
else
{
db.A.Add(a);
db.SaveChange();
}
}
簡単な例を次に示します。
//ここで、エンティティを追加済みとしてマークします
Context.Entry(yourPersonEntity).State = System.Data.EntityState.Added;
//そしてここで true または false を返すと挿入が成功します
bool isSaved = Context.SaveChanges() > 0;
isSaved が true か false かに応じて、必要なことを行います。
例外をログに記録することが望ましいですが、コンテキストをオーバーライドして行うことをお勧めしますSaveChanges()
。
またFirsOrDefault()
、最初の値を返すだけであり、値が一意であることを保証しないため、使用しないでください。
シーケンスの最初の要素を返します。要素が見つからない場合はデフォルト値を返します。
top(2) クエリを実行するように使用SingleOrDefault()
し、結果が複数ある場合は例外をスローします。
シーケンスの唯一の要素を返します。シーケンスが空の場合はデフォルト値を返します。シーケンスに複数の要素がある場合、このメソッドは例外をスローします。