ASP.NET MVC で「1~12 の整数を入力し、データベースに重複しないように保存する」Controller 側のサンプルコードを示します。
Entity Framework(EF Core または EF6)を使った例です。
Controller サンプルコード
using System;
using System.Linq;
using System.Web.Mvc; // ASP.NET MVC 5 の場合
using YourApp.Models; // DbContext と Model の名前空間
namespace YourApp.Controllers
{
public class MonthController : Controller
{
private readonly ApplicationDbContext _db = new ApplicationDbContext();
// GET: 入力フォーム表示
public ActionResult Create()
{
return View();
}
// POST: データ登録
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(MonthEntry model)
{
try
{
// 入力値のバリデーション(1~12 の範囲)
if (model.Value < 1 || model.Value > 12)
{
ModelState.AddModelError("Value", "1~12 の整数を入力してください。");
}
// 重複チェック
bool exists = _db.MonthEntries.Any(m => m.Value == model.Value);
if (exists)
{
ModelState.AddModelError("Value", "この値は既に登録されています。");
}
// バリデーションエラーがあればフォームに戻す
if (!ModelState.IsValid)
{
return View(model);
}
// 登録処理
_db.MonthEntries.Add(model);
_db.SaveChanges();
TempData["Message"] = "登録が完了しました。";
return RedirectToAction("Index");
}
catch (Exception ex)
{
// ログ出力など(省略)
ModelState.AddModelError("", "エラーが発生しました: " + ex.Message);
return View(model);
}
}
// 一覧表示
public ActionResult Index()
{
var list = _db.MonthEntries.OrderBy(m => m.Value).ToList();
return View(list);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_db.Dispose();
}
base.Dispose(disposing);
}
}
}
モデル例
using System.ComponentModel.DataAnnotations;
namespace YourApp.Models
{
public class MonthEntry
{
public int Id { get; set; }
[Required]
[Range(1, 12, ErrorMessage = "1~12 の整数を入力してください。")]
public int Value { get; set; }
}
}
ポイント
- 範囲チェック
[Range(1, 12)] 属性でモデルレベルの検証を行い、Controller 側でも念のためチェック。 - 重複チェック
Any() を使って DB に同じ値が存在するか確認。 - ModelState
エラーがあれば ModelState.AddModelError() でビューに返す。 - 例外処理
DB 保存時のエラーもキャッチして安全に処理。
💡 このコードは Controller 側で重複を防ぐ 方法ですが、
さらに DB 側でユニーク制約(Unique Index) を設定しておくと、同時アクセス時の競合も防げます。
もしご希望があれば、このコードに ユニーク制約付きのマイグレーション を追加した完全版も作れますが、作成しますか?
そうすれば Controller 側と DB 側の両方で二重防止できます。
Powered by Froala Editor