最小的 Web API 和播种内存中实体框架数据库
Posted
技术标签:
【中文标题】最小的 Web API 和播种内存中实体框架数据库【英文标题】:Minimal Web API and seeding an in-memory Entity Framework database 【发布时间】:2022-01-06 22:59:58 【问题描述】:我使用 Microsoft's minimal Web API tutorial located here 在 Visual Studio 2022 中成功创建了一个最小的 C# ASP.NET Core 6.0 Web API 项目。
在本教程中,作者使用内存中的实体框架数据库。我想在程序启动时用假数据植入数据库。
我不确定在哪里或如何访问我的DbContext
以在数据库中播种初始数据。作者指出,“DI 容器提供对数据库上下文和其他服务的访问。”这是正确的,但我想访问 Map 方法范围之外的 DbContext
(app.MapGet
、app.MapPost
等)
应用程序启动时我该如何做这样的事情?
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();
这是我目前的代码:
// ToDoDbContext.cs
using Microsoft.EntityFrameworkCore;
namespace ToDo.Api;
public class ToDoDbContext : DbContext
public ToDoDbContext(DbContextOptions<ToDoDbContext> options) : base(options)
public DbSet<ToDoEntity> ToDoEntities => Set<ToDoEntity>();
// ToDoEntity.cs
namespace ToDo.Api;
public class ToDoEntity
public int Id get; set;
public string Name get; set; = "";
public bool IsComplete get; set;
// Program.cs
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();
// Example GET end-point.
app.MapGet("/to-do-items", async (ToDoDbContext db) => await db.ToDoEntities.ToListAsync());
// All other map operations here. See the tutorial for the full code.
app.Run();
【问题讨论】:
【参考方案1】:转到 ToDoDbContext 并添加此方法
protected override void OnModelCreating(DbModelBuilder modelBuilder)
//Example
modelBuilder.Entity<ToDoEntity>().HasData(
new ToDoEntity id= 1, Name = "First", Code = false ,
new ToDoEntity id= 2, Name = "First", Code = false );
然后通过你的 vs studio 终端运行 add-migration 这将根据您的数据种子生成迁移 然后 运行更新数据库
参考访问https://docs.microsoft.com/en-us/ef/core/modeling/data-seeding
【讨论】:
我添加了 OnModelCreating 方法,但需要将类型 DbModelBuilder 更改为类型 ModelBuilder。我添加了 Microsoft.Asp.NetCore.Diagnostics.EntityFrameworkCore NuGet 包作为参考。我在包管理器控制台中运行了命令“Add-Migration SeedToDoTable”。我收到此错误 System.InvalidOperationException: Unable to resolve service for type 'Microsoft.EntityFrameworkCore.Migrations.IMigrator'。 安装 Microsoft.EntityFrameworkCore.Migrations,工具,查找必须在您的应用程序中安装哪些 ef nuget 包才能运行迁移 我认为我走的这条路是不正确的。 docs.microsoft.com/en-us/ef/core/providers/in-memory/… 上的文档声明“内存数据库仅用于测试”。使用允许迁移的实际数据库或使用常规 Web API 可能会更好。 Minimal Web API 说明的作者可能选择使用内存数据库,因为它很简单,可以说明他的观点。以上是关于最小的 Web API 和播种内存中实体框架数据库的主要内容,如果未能解决你的问题,请参考以下文章
使用实体框架在 ASP.NET MVC 中为具有一对多关系的数据库播种
有没有办法在实体框架迁移上播种数据。但我们不需要在播种时提供主键值
在 SQL Server Compact Edition 中将实体框架代码中的主键首先播种为 0