You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 6 Minimal Web API如何在启动时为EF内存数据库播种初始数据

解决方案

在Program.cs中,完成WebApplication实例构建(即var app = builder.Build();)之后、接口映射和app.Run()之前,通过创建服务作用域获取ToDoDbContext实例执行数据播种即可,完整实现代码如下:

using Microsoft.EntityFrameworkCore;
using ToDo.Api;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddDbContext<ToDoDbContext>(options => options.UseInMemoryDatabase("ToDoList"));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

var app = builder.Build();

// ========== 新增数据播种代码 开始 ==========
// 创建服务作用域,用于获取Scoped生命周期的DbContext
using var scope = app.Services.CreateScope();
var serviceProvider = scope.ServiceProvider;
var db = serviceProvider.GetRequiredService<ToDoDbContext>();
// 先判断库中是否已有数据,避免重复插入
if (!db.ToDoEntities.Any())
{
    db.ToDoEntities.AddRange(new List<ToDoEntity>
    {
        new ToDoEntity
        {
            Name = "Code",
            IsComplete = false
        },
        new ToDoEntity
        {
            Name = "Game",
            IsComplete = false
        },
        new ToDoEntity
        {
            Name = "Sleep",
            IsComplete = false
        }
    });
    db.SaveChanges();
}
// ========== 新增数据播种代码 结束 ==========

// 示例GET接口
app.MapGet("/to-do-items", async (ToDoDbContext db) => await db.ToDoEntities.ToListAsync());

// 其余接口映射代码参考官方教程实现
app.Run();

实现说明

  • 默认注册的DbContext生命周期为Scoped,不能直接从根服务容器获取,必须通过CreateScope()手动创建作用域后再获取实例,避免生命周期不匹配的问题
  • 代码中增加了数据存在性判断,避免应用每次重启都重复插入相同的种子数据

内容的提问来源于stack exchange,提问作者Halcyon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:07