記事詳細


投稿日
2026年08月23日20時14分
タイトル

asp.net core mvc:  if (DateTime.Today.Day == 23) { var payments = new List<Payment>(); payments.Add(new() { Posted = DateTime.Today, SubjectNameId = null, Amount = 0, Balance = 0 }); db.Payments.AddRange(payments); db.SaveChanges(); この場合の2重登録防止のコードを教えてください。

内容

なるほど、
「毎月23日に自動で Payment を登録するけど、同じ日に同じデータが二重登録されないようにしたい」ということですね。

ASP.NET Core MVC + EF Core であれば、登録前に同じ日付のレコードが既に存在するかをチェックすればOKです。

二重登録防止コード例

Csharp
// 今日の日付 var today = DateTime.Today; // 既に今日のレコードが存在するか確認 bool exists = db.Payments.Any(p => p.Posted == today); if (!exists) { var payments = new List<Payment> { new Payment { Posted = today, SubjectNameId = null, Amount = 0, Balance = 0 } }; db.Payments.AddRange(payments); db.SaveChanges(); } else { // ログや通知など Console.WriteLine("本日のPaymentは既に登録済みです。"); }

補足ポイント

  1. Any() を使って存在確認
    • FirstOrDefault() より軽量で、存在チェックだけなら高速。
  2. 日付比較は DateTime.Date を使う
    • Posted が DateTime 型で時刻も含まれる場合は、
      p.Posted.Date == today のように .Date で比較。
  3. DBレベルでもユニーク制約を付けるとより安全
    • アプリ側のチェックだけだと、同時実行時に二重登録の可能性が残るため、
      DBにユニークインデックスを設定すると確実です。

DBレベルのユニーク制約例(SQL Server)

Sql
CREATE UNIQUE INDEX UX_Payments_Posted ON Payments (Posted);

これで同じ Posted のレコードはDBが拒否します。

✅ おすすめ構成

  • アプリ側:Any() で事前チェック
  • DB側:ユニーク制約で最終防衛

もし希望があれば、この処理を毎月23日に自動実行するスケジューラーコードも組み込み例を作れますが、作りますか?
そうすれば手動実行時の二重登録も防げます。

Powered by Froala Editor

添付画像

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