記事詳細


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

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日に自動実行するスケジューラ

内容

了解しました。
ご質問は以下の2点ですね。

  1. 毎月23日に自動登録する処理で、二重登録を防ぐ方法
  2. ASP.NET Core MVCで毎月23日に自動実行するスケジューラーの組み込み例

① 二重登録防止コード例

Paymentsテーブルに同じ日付のレコードが既に存在するかをチェックしてから登録します。

Csharp
// 今日が23日か確認 if (DateTime.Today.Day == 23) { // 既に今日のレコードが存在するか確認 bool exists = db.Payments.Any(p => p.Posted == DateTime.Today); if (!exists) { var payment = new Payment { Posted = DateTime.Today, SubjectNameId = null, Amount = 0, Balance = 0 }; db.Payments.Add(payment); db.SaveChanges(); } }

ポイント

  • Any() を使って存在チェック
  • Posted が DateTime.Today と一致するレコードがあれば登録しない
  • DB側でも Posted にユニーク制約を付けるとさらに安全

② 毎月23日に自動実行するスケジューラー例(Hosted Service)

ASP.NET Coreでは、Windowsのタスクスケジューラやcronの代わりに
IHostedService を使ってアプリ内で定期実行できます。

サービスクラス

Csharp
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.DependencyInjection; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; public class MonthlyPaymentService : BackgroundService { private readonly IServiceProvider _serviceProvider; public MonthlyPaymentService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { var now = DateTime.Now; // 毎日0時にチェック if (now.Day == 23 && now.Hour == 0 && now.Minute == 0) { using (var scope = _serviceProvider.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>(); bool exists = db.Payments.Any(p => p.Posted == DateTime.Today); if (!exists) { db.Payments.Add(new Payment { Posted = DateTime.Today, SubjectNameId = null, Amount = 0, Balance = 0 }); db.SaveChanges(); } } } // 1分ごとにチェック await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); } } }

Program.cs への登録

Csharp
var builder = WebApplication.CreateBuilder(args); // DbContext登録 builder.Services.AddDbContext<ApplicationDbContext>(); // HostedService登録 builder.Services.AddHostedService<MonthlyPaymentService>(); var app = builder.Build(); app.MapControllers(); app.Run();

補足

  • 二重登録防止はアプリ側のチェック+DBのユニーク制約の両方を推奨
  • スケジューラーはアプリが常時稼働している前提(IISやKestrel)
  • 外部ジョブ管理(Windows Task Scheduler, cron, Hangfire, Quartz.NET)を使うとより柔軟に管理可能

もしご希望があれば、このコードを Hangfire を使った「管理画面付きスケジューラー」に書き換えることもできます。
Hangfireなら毎月23日0時に確実に実行できます。

このあと、Hangfireを使った「毎月23日0時実行+二重登録防止」コード例も作成できますが、
そちらにしますか?
そうすればアプリが落ちても再実行保証ができます。

Powered by Froala Editor

添付画像

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