わかりました。では、前回のコード例をさらに違った形で、
「アプリ起動時にサービスクラス経由で初期データを投入する」 パターンにしてみます。
これにより、Program.cs がすっきりし、初期化ロジックを分離できます。
① DbContext クラス
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public DbSet<User> Users { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options)
: base(options) { }
}
② モデルクラス
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
③ 初期データ投入用サービス
public static class DatabaseSeeder
{
public static void Seed(AppDbContext db)
{
// 既にデータがある場合は何もしない
if (db.Users.Any()) return;
var initialUsers = new List<User>
{
new User { Name = "Admin", Email = "admin@example.com" },
new User { Name = "Guest", Email = "guest@example.com" }
};
db.Users.AddRange(initialUsers);
db.SaveChanges();
}
}
④ Program.cs(ASP.NET Core MVC の場合)
var builder = WebApplication.CreateBuilder(args);
// DbContext 登録
builder.Services.AddDbContext<AppDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
var app = builder.Build();
// 起動時に DB 作成&初期化
using (var scope = app.Services.CreateScope())
{
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
db.Database.Migrate();
DatabaseSeeder.Seed(db); // 初期データ投入
}
app.MapDefaultControllerRoute();
app.Run();
⑤ 接続文字列例(appsettings.json)
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=MyAppDb;Trusted_Connection=True;TrustServerCertificate=True;"
}
}
この構成のメリット
- 初期化処理を
DatabaseSeeder に分離することで、テストや再利用が容易。 Program.cs がシンプルになり、責務が明確化。- 条件付き挿入で重複データを防止。
この方法なら、将来的に「ユーザー以外の初期データ」も同じ仕組みで追加できます。
もしご希望なら、このパターンを ASP.NET MVC(.NET Framework版) に合わせたコードにも変換できますが、そちらも作りますか?
Powered by Froala Editor