記事詳細


投稿日
2026年06月10日06時32分
タイトル

asp.net mvc: データベーステーブルに1~12(int)の値を挿入する入力フォームに於いて重複させないcontroller側のコードを教えてください。

内容

ASP.NET MVC で「1~12 の整数を入力し、データベースに重複しないように保存する」Controller 側のサンプルコードを示します。
Entity Framework(EF Core または EF6)を使った例です。

Controller サンプルコード

Csharp
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); } } }

モデル例

Csharp
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; } } }

ポイント

  1. 範囲チェック
    [Range(1, 12)] 属性でモデルレベルの検証を行い、Controller 側でも念のためチェック。
  2. 重複チェック
    Any() を使って DB に同じ値が存在するか確認。
  3. ModelState
    エラーがあれば ModelState.AddModelError() でビューに返す。
  4. 例外処理
    DB 保存時のエラーもキャッチして安全に処理。

💡 このコードは Controller 側で重複を防ぐ 方法ですが、
さらに DB 側でユニーク制約(Unique Index) を設定しておくと、同時アクセス時の競合も防げます。

もしご希望があれば、このコードに ユニーク制約付きのマイグレーション を追加した完全版も作れますが、作成しますか?
そうすれば Controller 側と DB 側の両方で二重防止できます。

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Controllers
編集 | 記事一覧