最小的 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 方法范围之外的 DbContextapp.MapGetapp.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

在 python 金字塔 web 框架中,如何在播种之前删除所有数据库表行?

实体框架核心2.1中的种子关系数据