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
相关产品推荐
相关产品推荐

