了解です。では、先ほどの内容を少し違った切り口で、
「アプリ起動時にコードで直接データを挿入する」 形にして再構成します。
HasData を使わず、DbContext 経由で起動時に Add() → SaveChanges() を行う方法です。
① 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; }
}
③ アプリ起動時に初期データを投入
ASP.NET Core MVC の場合、Program.cs に以下を追加します。
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(); // DB作成&マイグレーション適用
// データが存在しない場合のみ挿入
if (!db.Users.Any())
{
db.Users.AddRange(
new User { Name = "Admin", Email = "admin@example.com" },
new User { Name = "Guest", Email = "guest@example.com" }
);
db.SaveChanges();
}
}
app.MapDefaultControllerRoute();
app.Run();
④ 接続文字列例(appsettings.json)
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=MyAppDb;Trusted_Connection=True;TrustServerCertificate=True;"
}
}
この方法の特徴
HasData を使わないため、マイグレーションに依存せず柔軟に初期化可能。- 条件分岐(
if (!db.Users.Any()))で重複挿入を防止。 - 開発・テスト環境でのデータ投入や、簡易的なサンプルアプリに向いている。
もしご希望なら、このコードを ASP.NET MVC(.NET Framework版) 用に書き換えたサンプルも作れます。
そちらも作成しますか?
Powered by Froala Editor