2022年8月15日:--使用 ASP.NET Core、最小 API 和 .NET 6 创建--结合使用数据库和最小 API、Entity Framework Core 和 ASP.NET Core

详解 .Net6 Minimal API 的使用方式 随着 .Net6 的发布,微软也改进了对之前 ASP.NET Core 构建方式,使用了新的 Minimal API 模式。以前默认的方式是需要在 Startup 中注册 IOC 和中间件相关,但是在 Minimal API 模式下你只需要简单的写几行代码就可以构建一个 ASP.NET Core的Web 应用,可谓非常的简单,加之配合 c# 的 global using 和 Program 的顶级声明方式,使得 Minimal API 变得更为简洁,不得不说 .NET 团队在 .NET 上近几年下了不少功夫 阅读详情

了解如何将数据库添加到最小 API 应用程序。

简介

基于 ASP.NET Core 生成的最小 API 可以使用 Entity Framework (EF) Core 轻松地与大量数据库集成。

将了解如何使用 EF Core 将数据持久保存到内存数据库,然后再保存到 SQLite。 还将了解如何使用 EF Core 来查询数据库。

向最小 API 应用程序添加数据库支持。

什么是Entity Framework Core?

大多数重要的 Web 应用程序都需要对数据可靠地运行创建、读取、更新和删除 (CRUD) 操作。 它们还需要在应用程序重启期间保留这些更改。 尽管有各种选项可用于在 .NET 应用程序中永久保留数据,但 Entity Framework (EF) Core 是一个用户友好型解决方案,非常适合许多 .NET 应用程序。

了解EF Core

EF Core 是 .NET 应用程序的轻型、可扩展、开源和跨平台的数据访问技术。

EF Core 可以用作对象关系映射器:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库。
  • 无需再像通常那样编写大部分数据访问代码。

EF Core 支持大量常见数据库,包括 SQLite、MySQL、PostgreSQL、Oracle 和 Microsoft SQL Server。

模型

使用 EF Core 时,数据访问是通过使用模型来执行的。 模型由实体类和表示数据库会话的上下文对象构成。 上下文对象允许查询并保存数据。

实体类

在此场景中,将实现一个比萨饼存储管理 API,因此你将使用 Pizza 实体类。 存储中的比萨饼具有名称和说明。 它们还需要 ID,以便 API 和数据库识别它们。 你将在应用程序中使用的 Pizza 实体类可识别比萨饼:

namespace PizzaStore.Models 
{
  public class Pizza
  {
      public int Id { get; set; }
      public string? Name { get; set; }
      public string? Description { get; set; }
  }
}

上下文类

此应用程序只有一个实体类,但大多数应用程序将有多个实体类。 上下文类负责查询数据并将其保存到实体类,以及用于创建和管理数据库连接。

使用EF Core执行CRUD操作

配置 EF Core 后,可以使用它对实体类执行 CRUD 操作。 然后,可以针对 C# 类进行开发,并将数据库操作委托给上下文类。 数据库提供程序反过来将其转换为特定于数据库的查询语言。 例如,关系数据库的 SQL。 即使上下文中已存在结果中返回的实体,也始终对数据库执行查询。

查询数据

上下文对象公开每个实体类型的集合类。 在前面的示例中,上下文类将 Pizza 对象的集合公开为 Pizzas。 假设有一个上下文类实例,则可以在数据库中查询所有比萨饼:

var pizzas = await db.Pizzas.ToListAsync();

插入数据

可以使用相同的上下文对象插入新比萨饼:

await db.pizzas.AddAsync(
    new Pizza { ID = 1, Name = "Pepperoni", Description = "The classic pepperoni pizza" });

删除数据

删除操作很简单。 它们只需要删除项的 ID:

var pizza = await db.pizzas.FindAsync(id);
if (pizza is null)
{
    //Handle error
}
db.pizzas.Remove(pizza);

更新数据

同样,可以更新现有比萨饼:

int id = 1;
var updatepizza = new Pizza { Name = "Pineapple", Description = "Ummmm?" })
var pizza = await db.pizzas.FindAsync(id);
if (pizza is null)
{
    //Handle error
}
pizza.Item = updatepizza.Item;
pizza.IsComplete = updatepizza.IsComplete;
await db.SaveChangesAsync();

使用EF Core内存数据库

EF Core 包含可用于测试应用程序的内存数据库提供程序。 内存数据库提供程序对于测试和开发非常有用,但不应在生产中使用。 在接下来的单元中,你将使用内存数据库提供程序来创建数据库并对其执行 CRUD 操作。

将EF Core添加到最小API

此模块使用 .NET 6.0 SDK。 通过在首选终端中运行以下命令,确保你已安装 .NET 6.0:

dotnet --list-sdks

将显示类似于下面的输出:

3.1.100 [C:\program files\dotnet\sdk]
5.0.100 [C:\program files\dotnet\sdk]
6.0.100 [C:\program files\dotnet\sdk]

确保列出了以 6 开头的版本。 

设置项目

首先,需要创建一个项目。 已安装 .NET 6,现已准备就绪。 将数据持久性添加到比萨饼管理 API。

通过运行 dotnet new 创建 Web API:

dotnet new web -o PizzaStore -f net6.0

输入以下命令,以转到 PizzaStore 目录:

cd PizzaStore

安装 Swashbuckle 包:

dotnet add package Swashbuckle.AspNetCore --version 6.2.3

创建 Pizza.cs 文件并在其中提供以下内容:

namespace PizzaStore.Models 
{
  public class Pizza
  {
      public int Id { get; set; }
      public string? Name { get; set; }
      public string? Description { get; set; }
  }
}

前面的 Pizza 类是一个表示比萨饼的简单对象。 此代码是数据模型。 稍后将使用 Entity Framework (EF) Core 将此数据模型映射到数据库表。

打开 Program.cs,并添加代码: 

using Microsoft.OpenApi.Models;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
     c.SwaggerDoc("v1", new OpenApiInfo {
         Title = "PizzaStore API",
         Description = "Making the Pizzas you love",
         Version = "v1" });
});

var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
   c.SwaggerEndpoint("/swagger/v1/swagger.json", "PizzaStore API V1");
});

app.MapGet("/", () => "Hello World!");

app.Run();

Visual Studio Code 可能会提示你添加资产以调试项目。 单击对话框中的“Yes”。

将EF Core添加到项目

若要将项存储在待办事项列表中,请安装 EntityFrameworkCore.InMemory 包。

在终端窗口中,输入以下代码以添加 EF Core InMemory 包:

dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 6.0

PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore> dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 6.0
  正在确定要还原的项目…
  Writing C:\Users\a-xiaobodou\AppData\Local\Temp\tmp2762.tmp
info : X.509 certificate chain validation will use the default trust store selected by .NET.
info : 正在将包“Microsoft.EntityFrameworkCore.InMemory”的 PackageReference 添加到项目“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”。
info : 正在还原 C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj 的包...
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.inmemory/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.inmemory/index.json 923 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.inmemory/6.0.0/microsoft.entityframeworkcore.inmemory.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.inmemory/6.0.0/microsoft.entityframeworkcore.inmemory.6.0.0.nupkg 76 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore/index.json 291 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore/6.0.0/microsoft.entityframeworkcore.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore/6.0.0/microsoft.entityframeworkcore.6.0.0.nupkg 68 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.abstractions/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.analyzers/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.memory/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/system.collections.immutable/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/system.diagnostics.diagnosticsource/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.abstractions/index.json 283 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.abstractions/6.0.0/microsoft.entityframeworkcore.abstractions.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.abstractions/6.0.0/microsoft.entityframeworkcore.abstractions.6.0.0.nupkg 80 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.analyzers/index.json 576 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.analyzers/6.0.0/microsoft.entityframeworkcore.analyzers.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/system.collections.immutable/index.json 563 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/system.diagnostics.diagnosticsource/index.json 558 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.memory/index.json 590 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging/index.json 579 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/system.collections.immutable/6.0.0/system.collections.immutable.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection/index.json 597 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/system.diagnostics.diagnosticsource/6.0.0/system.diagnostics.diagnosticsource.6.0.0.nupkg
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.memory/6.0.0/microsoft.extensions.caching.memory.6.0.0.nupkg
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging/6.0.0/microsoft.extensions.logging.6.0.0.nupkg
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection/6.0.0/microsoft.extensions.dependencyinjection.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.analyzers/6.0.0/microsoft.entityframeworkcore.analyzers.6.0.0.nupkg 77 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/system.collections.immutable/6.0.0/system.collections.immutable.6.0.0.nupkg 73 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/system.diagnostics.diagnosticsource/6.0.0/system.diagnostics.diagnosticsource.6.0.0.nupkg 71 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.memory/6.0.0/microsoft.extensions.caching.memory.6.0.0.nupkg 69 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging/6.0.0/microsoft.extensions.logging.6.0.0.nupkg 69 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection/6.0.0/microsoft.extensions.dependencyinjection.6.0.0.nupkg 68 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection.abstractions/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging.abstractions/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.abstractions/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.options/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json
info :   GET https://api.nuget.org/v3-flatcontainer/system.runtime.compilerservices.unsafe/index.json
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection.abstractions/index.json 276 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection.abstractions/6.0.0/microsoft.extensions.dependencyinjection.abstractions.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.options/index.json 277 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging.abstractions/index.json 283 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.options/6.0.0/microsoft.extensions.options.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.abstractions/index.json 292 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging.abstractions/6.0.0/microsoft.extensions.logging.abstractions.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/index.json 308 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.abstractions/6.0.0/microsoft.extensions.caching.abstractions.6.0.0.nupkg
info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/6.0.0/microsoft.extensions.primitives.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/system.runtime.compilerservices.unsafe/index.json 286 毫秒
info :   GET https://api.nuget.org/v3-flatcontainer/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencyinjection.abstractions/6.0.0/microsoft.extensions.dependencyinjection.abstractions.6.0.0.nupkg 76 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.options/6.0.0/microsoft.extensions.options.6.0.0.nupkg 72 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.logging.abstractions/6.0.0/microsoft.extensions.logging.abstractions.6.0.0.nupkg 71 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.caching.abstractions/6.0.0/microsoft.extensions.caching.abstractions.6.0.0.nupkg 70 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.primitives/6.0.0/microsoft.extensions.primitives.6.0.0.nupkg 70 毫秒
info :   OK https://api.nuget.org/v3-flatcontainer/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg 74 毫秒
info : 已通过内容哈希 xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0 。
info : 已通过内容哈希 9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Primitives 6.0.0 。
info : 已通过内容哈希 /iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg== 从 https://api.nuget.org/v3/index.json 安装 System.Runtime.CompilerServices.Unsafe 6.0.0 。
info : 已通过内容哈希 bcz5sSFJbganH0+YrfvIjJDIcKNW7TL07C4d1eTmXy/wOt52iz4LVogJb6pazs7W0+74j0YpXFErvp++Aq5Bsw== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Caching.Abstractions 6.0.0 。
info : 已通过内容哈希 l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA== 从 https://api.nuget.org/v3/index.json 安装 System.Collections.Immutable 6.0.0 。
info : 已通过内容哈希 eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Logging 6.0.0 。
info : 已通过内容哈希 WJmphvCn0wue9AX+Wvqj3XZ3ehNi9oyYBFNLtHVNvKqZrcimXBOqLo5RNf1fJWYSLWhOia/vzG4JtkAeZxZ8FQ== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.InMemory 6.0.0 。
info : 已通过内容哈希 BqWBL05PUDKwPwLeQCJdc2R4cIUycXV9UmuSjYfux2fcgyet8I2eYnOWlA7NgsDwRVcxW26vxvNQ0wuc8UAcLA== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.Analyzers 6.0.0 。
info : 已通过内容哈希 frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw== 从 https://api.nuget.org/v3/index.json 安装 System.Diagnostics.DiagnosticSource 6.0.0 。
info : 已通过内容哈希 k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.DependencyInjection 6.0.0 。
info : 已通过内容哈希 MrMLWEw4JsZdkVci0MkkGj+fSjZrXnm3m6UNuIEwytiAAIZPvJs3iPpnzfK4qM7np82W374voYm96q7QCdL0ow== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.Abstractions 6.0.0 。
info : 已通过内容哈希 dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Options 6.0.0 。
info : 已通过内容哈希 Ve3BlCzhAlVp5IgO3+8dacAhZk1A0GlIlFNkAcfR2TfAibLKWIt5DhVJZfu4YtW+XZ89OjYf/agMcgjDtPxdGA== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Caching.Memory 6.0.0 。
info : 已通过内容哈希 /HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Logging.Abstractions 6.0.0 。
info : 已通过内容哈希 BdHAtHzfQt3rltgSoYamSlHg2qawPtEDT677/bcSJlO8lQ/lj6XWlusM0TOt59O8Sbqm3hAC1a+4cEBxmv56pw== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore 6.0.0 。
info : 包“Microsoft.EntityFrameworkCore.InMemory”与项目“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”中指定的所有框架均兼容。
info : 包“Microsoft.EntityFrameworkCore.InMemory”(版本为 6.0)的 PackageReference 已添加到文件“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”。
info : 将资产文件写入磁盘。路径: C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\obj\project.assets.json
log  : 已还原 C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj (用时 7 sec)。
PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore>

将 using Microsoft.EntityFrameworkCore; 添加到 Program.cs 和 Pizza.cs 文件的顶部。

现在,已将 EF Core 添加到项目,可以将代码连接到要保存和查询的数据。 若要执行此步骤,将创建 PizzaDb 类。 PizzaDb 类将执行以下任务:

  • 从数据库中的 Pizza 列表公开你的 Pizzas 属性。
  • 使用 UseInMemoryDatabase 连接内存数据库存储。 只要应用运行时,数据就会存储在此处。

若要设置内存数据库,请将以下代码添加到 Pizza.cs 类底部(在最后的 } 的上方):

class PizzaDb : DbContext
{
    public PizzaDb(DbContextOptions options) : base(options) { }
    public DbSet<Pizza> Pizzas { get; set; }
}

DbContext 表示一个连接或会话,用于查询和保存数据库中实体的实例。

将 using PizzaStore.Models; 添加到 Program.cs 文件的顶部。

在 Program.cs 中,调用 AddSwaggerGen 之前,添加以下代码:

builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items"));

返回项列表

若要从比萨饼列表中的项列表中进行读取,请在调用 app.Run(); 之前添加以下代码以添加“/pizza”路由:

app.MapGet("/pizzas", async (PizzaDb db) => await db.Pizzas.ToListAsync());

运行应用程序

通过调用 dotnet run 来运行应用。 此操作会生成应用,并将应用托管在 5000-5300 范围内的某个端口上。 HTTPS 会在 7000-7300 范围内为应用选择一个端口。

如果要替代随机端口选择行为,可以设置要在 launchSettings.json 中使用的端口。

dotnet run

下面是输出在终端中的情况:

Building...
 info: Microsoft.Hosting.Lifetime[14]
       Now listening on: https://localhost:7200
 info: Microsoft.Hosting.Lifetime[14]
       Now listening on: http://localhost:5100
 info: Microsoft.Hosting.Lifetime[0]
       Application started. Press Ctrl+C to shut down.
 info: Microsoft.Hosting.Lifetime[0]
       Hosting environment: Development
 info: Microsoft.Hosting.Lifetime[0]
       Content root path: /<path>/PizzaStore

在浏览器中转到 https://localhost:{PORT}/swagger。 选择 GET /pizzas 按钮,你会看到列表在 Response body 下为空。

创建新项

让我们将新任务 POST 到你先前创建的 app.MapGet 下的比萨饼列表。

app.MapPost("/pizza", async (PizzaDb db, Pizza pizza) =>
{
    await db.Pizzas.AddAsync(pizza);
    await db.SaveChangesAsync();
    return Results.Created($"/pizza/{pizza.Id}", pizza);
});

测试API

返回到 Swagger,此时应会看到 POST/pizza。 向比萨饼列表添加新项:

选择“POST /pizza”。

选择“试用”。

将请求正文替换为以下内容:

{
    "name": "Pepperoni",
    "description": "A classic pepperoni pizza"
}

选择“执行”。

读取列表中的项

读取列表中的项:

选择“GET /pizzas”。
选择“试用”。
选择“执行”。
Response body 将包含刚刚添加的项。

[
  {
    "id": 1,
    "name": "Pepperoni",
    "description": "A classic pepperoni pizza"
  }
]

若要根据 id GET 项目,请将代码添加到前面创建的 app.MapPost 路由下。

app.MapGet("/pizza/{id}", async (PizzaDb db, int id) => await db.Pizzas.FindAsync(id));

若要查看此内容,可以访问 https://localhost:{PORT}/pizza/1 或使用 Swagger UI。 由于使用的是内存数据库,在重启应用程序后不会列出前面创建的比萨饼,因此需要再次输入。

更新项

若要更新现有项目,请将代码添加到你创建的 GET /pizza/{id} 路由下:

app.MapPut("/pizza/{id}", async (PizzaDb db, Pizza updatepizza, int id) =>
{
    var pizza = await db.Pizzas.FindAsync(id);
    if (pizza is null) return Results.NotFound();
    pizza.Name = updatepizza.Name;
    pizza.Description = updatepizza.Description;
    await db.SaveChangesAsync();
    return Results.NoContent();
});

在 Swagger UI 中选择“PUT /pizza/{id}”。

选择“试用”。

在“ID”文本框中,输入 1。

最后,更新 Request body。 粘贴以下 JSON 并将 name 更改为 Pineapple。

{
    "id": 1,
    "name": "Pineapple",
  }

选择“执行”。

若要测试代码,请滚动回 GET /pizza/{id}。 比萨饼现在的名称为 Pineapple。

​​​​​​​

删除项

若要更新现有项目,请将代码添加到前面创建的 PUT /pizza/{id} 下:

app.MapDelete("/pizza/{id}", async (PizzaDb db, int id) =>
{
  var pizza = await db.Pizzas.FindAsync(id);
  if (pizza is null)
  {
    return Results.NotFound();
  }
  db.Pizzas.Remove(pizza);
  await db.SaveChangesAsync();
  return Results.Ok();
});

现在,请尝试使用 Swagger 接口删除某个项。

将 EF Core 添加到现有的最小 API 应用程序,并使用内存数据库来存储数据。 接下来,你将了解如何使用实际数据库来存储数据,以便在应用程序关闭期间保持数据。

将SQLite数据库提供程序与EF Core结合使用

学习了如何将数据持久保存到内存数据库。 将数据持久保存到内存数据库在开发中非常有用。 但是,由于在应用程序重启时所有数据都将丢失,因此它并不适合用于生产。 在生产环境中,应将数据持久保存到数据库,如 SQL Server、MySQL、PostgreSQL 或 SQLite。

数据库提供程序从应用程序代码中抽象化数据库访问

通过抽象层(如 Entity Framework (EF) Core)执行数据库访问的好处之一是,它将应用程序与数据库提供程序分离。 你可以更改数据库提供程序,而无需重写数据库访问代码。 你无法在不影响应用程序代码的情况下切换数据库提供程序,但更改会最小化并本地化。

使用 EF Core 的相关优势在于,你可以重用代码、经验和数据访问库,以便与任何其他 EF Core 数据库提供程序一起使用。

EF Core 当前支持超过 20 个数据库提供程序。


添加新数据库提供程序的步骤

通常,将使用以下步骤来实现新数据库提供程序:

  1. 将一个或多个 NuGet 包添加到项目中,以包含数据库提供程序。
  2. 配置数据库连接。
  3. 在 ASP.NET Core 服务中配置数据库提供程序。
  4. 执行数据库迁移。

在此之前,已将数据保存在内存数据库中。 此数据库在开发应用程序时非常容易设置和使用,但数据不是持久的。 因此,在应用程序重启时数据将丢失。 在部署应用程序之前,需要将数据持久保存到数据库。

将升级应用程序以使用关系数据库来存储数据。 将使用 SQLite 来存储数据。

设置 SQLite 数据库

完成以下部分以设置 SQLite 数据库。


安装以下工具和包

使用 .NET CLI 和 Visual Studio 包管理器 UI,安装下列包:

  • SQLite EF Core 数据库提供程序:可以通过名为数据库提供程序的插件库访问许多不同的数据库。 以下包是用于 Entity Framework (EF) Core 的 SQLite 数据库提供程序。
    dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 6.0
    PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore> dotnet add package Microsoft.EntityFrameworkCore.Sqlite --version 6.0
      正在确定要还原的项目…
      Writing C:\Users\a-xiaobodou\AppData\Local\Temp\tmp9CF1.tmp
    info : X.509 certificate chain validation will use the default trust store selected by .NET.
    info : 正在将包“Microsoft.EntityFrameworkCore.Sqlite”的 PackageReference 添加到项目“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”。
    info : 正在还原 C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj 的包...
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite/index.json 906 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite/6.0.0/microsoft.entityframeworkcore.sqlite.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite/6.0.0/microsoft.entityframeworkcore.sqlite.6.0.0.nupkg 69 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite.core/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.bundle_e_sqlite3/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite.core/index.json 280 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite.core/6.0.0/microsoft.entityframeworkcore.sqlite.core.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.sqlite.core/6.0.0/microsoft.entityframeworkcore.sqlite.core.6.0.0.nupkg 67 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.relational/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.data.sqlite.core/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencymodel/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencymodel/index.json 566 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencymodel/6.0.0/microsoft.extensions.dependencymodel.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.dependencymodel/6.0.0/microsoft.extensions.dependencymodel.6.0.0.nupkg 71 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.bundle_e_sqlite3/index.json 1215 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.bundle_e_sqlite3/2.0.6/sqlitepclraw.bundle_e_sqlite3.2.0.6.nupkg
    info :   GET https://api.nuget.org/v3-flatcontainer/system.text.encodings.web/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/system.text.json/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/system.buffers/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/system.memory/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.bundle_e_sqlite3/2.0.6/sqlitepclraw.bundle_e_sqlite3.2.0.6.nupkg 72 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.provider.e_sqlite3/index.json
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.lib.e_sqlite3/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.relational/index.json 924 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.relational/6.0.0/microsoft.entityframeworkcore.relational.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/system.text.encodings.web/index.json 282 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/system.text.encodings.web/6.0.0/system.text.encodings.web.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/system.text.json/index.json 318 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/system.text.json/6.0.0/system.text.json.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.entityframeworkcore.relational/6.0.0/microsoft.entityframeworkcore.relational.6.0.0.nupkg 248 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.data.sqlite.core/index.json 1214 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.data.sqlite.core/6.0.0/microsoft.data.sqlite.core.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/system.buffers/index.json 455 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/system.buffers/4.5.1/system.buffers.4.5.1.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/system.text.json/6.0.0/system.text.json.6.0.0.nupkg 111 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/system.text.encodings.web/6.0.0/system.text.encodings.web.6.0.0.nupkg 200 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.data.sqlite.core/6.0.0/microsoft.data.sqlite.core.6.0.0.nupkg 66 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/system.buffers/4.5.1/system.buffers.4.5.1.nupkg 65 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.lib.e_sqlite3/index.json 555 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.lib.e_sqlite3/2.0.6/sqlitepclraw.lib.e_sqlite3.2.0.6.nupkg
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.configuration.abstractions/index.json
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.lib.e_sqlite3/2.0.6/sqlitepclraw.lib.e_sqlite3.2.0.6.nupkg 66 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/system.memory/index.json 1187 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/system.memory/4.5.4/system.memory.4.5.4.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.provider.e_sqlite3/index.json 1253 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/index.json 1266 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/system.memory/4.5.4/system.memory.4.5.4.nupkg 123 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/2.0.6/sqlitepclraw.core.2.0.6.nupkg
    info :   GET https://api.nuget.org/v3-flatcontainer/sqlitepclraw.provider.e_sqlite3/2.0.6/sqlitepclraw.provider.e_sqlite3.2.0.6.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.core/2.0.6/sqlitepclraw.core.2.0.6.nupkg 135 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/sqlitepclraw.provider.e_sqlite3/2.0.6/sqlitepclraw.provider.e_sqlite3.2.0.6.nupkg 141 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/system.memory/4.5.3/system.memory.4.5.3.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/system.memory/4.5.3/system.memory.4.5.3.nupkg 230 毫秒
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.configuration.abstractions/index.json 1079 毫秒
    info :   GET https://api.nuget.org/v3-flatcontainer/microsoft.extensions.configuration.abstractions/6.0.0/microsoft.extensions.configuration.abstractions.6.0.0.nupkg
    info :   OK https://api.nuget.org/v3-flatcontainer/microsoft.extensions.configuration.abstractions/6.0.0/microsoft.extensions.configuration.abstractions.6.0.0.nupkg 69 毫秒
    info : 已通过内容哈希 Vh8n0dTvwXkCGur2WqQTITvk4BUO8i8h9ucSx3wwuaej3s2S6ZC0R7vqCTf9TfS/I4QkXO6g3W2YQIRFkOcijA== 从 https://api.nuget.org/v3/index.json 安装 SQLitePCLRaw.core 2.0.6 。
    info : 已通过内容哈希 cx55qNWk5JmUMZgMfGvfwodW2z/t3Kix7Fbso9BxCPnPVaiVm8k9C4QLjegqJVvuRAA7RZigMYAqeRZ9Q4fWWQ== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.Sqlite.Core 6.0.0 。
    info : 已通过内容哈希 qWzV9o+ZRWq+pGm+1dF+R7qTgTYoXvbyowRoBxQJGfqTpqDun2eteerjRQhq5PQ/14S+lqto3Ft4gYaRyl4rdQ== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.Configuration.Abstractions 6.0.0 。
    info : 已通过内容哈希 zssYqiaucyGArZfg74rJuzK0ewgZiidsRVrZTmP7JLNvK806gXg6PGA46XzoJGpNPPA5uRcumwvVp6YTYxtQ5w== 从 https://api.nuget.org/v3/index.json 安装 SQLitePCLRaw.bundle_e_sqlite3 2.0.6 。
    info : 已通过内容哈希 3oDzvc/zzetpTKWMShs1AADwZjQ/36HnsufHRPcOjyRAAMLDlu2iD33MBI2opxnezcVUtXyqDXXjoFMOU9c7SA== 从 https://api.nuget.org/v3/index.json 安装 System.Memory 4.5.3 。
    info : 已通过内容哈希 peXLJbhU+0clVBIPirihM1NoTBqw8ouBpcUsVMlcZ4k6fcL2hwgkctVB2Nt5VsbnOJcPspQL5xQK7QvLpxkMgg== 从 https://api.nuget.org/v3/index.json 安装 SQLitePCLRaw.provider.e_sqlite3 2.0.6 。
    info : 已通过内容哈希 TD5QHg98m3+QhgEV1YVoNMl5KtBw/4rjfxLHO0e/YV9bPUBDKntApP4xdrVtGgCeQZHVfC2EXIGsdpRNrr87Pg== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Extensions.DependencyModel 6.0.0 。
    info : 已通过内容哈希 X6MCFkzJOBkcgzT00Bh7SAqbLM2rPuHgCWMivSRiZ0VGVfgf/l8nwGDe9wYSSjXVdw95JUggvWOQLcNfbBFuLA== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.Data.Sqlite.Core 6.0.0 。
    info : 已通过内容哈希 Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w== 从 https://api.nuget.org/v3/index.json 安装 System.Text.Encodings.Web 6.0.0 。
    info : 已通过内容哈希 Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg== 从 https://api.nuget.org/v3/index.json 安装 System.Buffers 4.5.1 。
    info : 已通过内容哈希 1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw== 从 https://api.nuget.org/v3/index.json 安装 System.Memory 4.5.4 。
    info : 已通过内容哈希 VwNbLaMpDD9s/tVmK/sivJsYoXdM3ARBjWMtFUXVExZ6AgZxPwSgILF2J4Y9CRvf/r6A0xitvFXQO6HPrZnwrg== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.Sqlite 6.0.0 。
    info : 已通过内容哈希 rTRzrSbkUXoCGijlT9O7oq7JfuaU1/+VFyfSBjADQuOsfa0FCrWeB8ybue5CDvO/D6uW0kvPvlKfY2kwxXOOdg== 从 https://api.nuget.org/v3/index.json 安装 Microsoft.EntityFrameworkCore.Relational 6.0.0 。
    info : 已通过内容哈希 zaJsHfESQvJ11vbXnNlkrR46IaMULk/gHxYsJphzSF+07kTjPHv+Oc14w6QEOfo3Q4hqLJgStUaYB9DBl0TmWg== 从 https://api.nuget.org/v3/index.json 安装 System.Text.Json 6.0.0 。
    info : 已通过内容哈希 xlstskMKalKQl0H2uLNe0viBM6fvAGLWqKZUQ3twX5y1tSOZKe0+EbXopQKYdbjJytNGI6y5WSKjpI+kVr2Ckg== 从 https://api.nuget.org/v3/index.json 安装 SQLitePCLRaw.lib.e_sqlite3 2.0.6 。
    info : 包“Microsoft.EntityFrameworkCore.Sqlite”与项目“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”中指定的所有框架均兼容。
    info : 包“Microsoft.EntityFrameworkCore.Sqlite”(版本为 6.0)的 PackageReference 已添加到文件“C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj”。
    info : 将资产文件写入磁盘。路径: C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\obj\project.assets.json
    log  : 已还原 C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore\PizzaStore.csproj (用时 6.69 sec)。
    PS C:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\ASP.NET\PizzaStore>

  • EF Core 工具:EF Core 工具执行设计时开发任务。 例如,它们基于现有数据库创建迁移、应用迁移和生成模型代码。
    dotnet tool install --global dotnet-ef

  • Microsoft.EntityFrameworkCore.Design:包含 EF Core 用于创建数据库的所有设计时逻辑。
    dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0


启用数据库创建

若要启用数据库创建,需要完成两个步骤:

  1. 设置数据库连接字符串。
  2. 将数据模型迁移到 SQLite 数据库。


设置数据库连接字符串

在 Program.cs 的应用生成器 var builder = WebApplication.CreateBuilder(args); 下方,添加一个连接字符串。

var connectionString = builder.Configuration.GetConnectionString("Pizzas") ?? "Data Source=Pizzas.db";

 
将上下文添加到服务

在 CRUD 部分,使用的是内存数据库。 现在,要将内存数据库替换为永久性数据库。

将生成服务中的当前内存数据库实现 builder.Services.AddDbContext<PizzaDb>(options => options.UseInMemoryDatabase("items")); 替换为此处的 SQLite 数据库:

builder.Services.AddSqlite<PizzaDb>(connectionString);


迁移数据模型

利用 EF Core 迁移工具,你现在可以开始首次迁移 InitialCreate。 在终端窗口中,运行 migrations 命令:

dotnet ef migrations add InitialCreate

EF Core 将在项目目录中创建一个名为“Migrations”的文件夹,该文件夹包含两个文件,其中包含表示数据库迁移的代码。


创建数据库和架构

完成迁移后,可以使用它来创建数据库和架构。

在终端窗口中,运行以下 database update 命令,将迁移应用到数据库:

dotnet ef database update

你应在项目目录中看到新创建的 Pizzas.db 文件。

运行和测试应用程序

现在,已经有了一个后备数据库,更改将永久保留。

若要测试应用程序,请在终端窗口中运行 dotnet run 命令,并在 Swagger UI 中与 API 交互。 可以使用 Ctrl+C 命令停止运行应用程序。 在 macOS 上使用 Cmd+C。 然后再次运行该应用程序,并验证更改是否仍然保留。

ASP.NET Core 10 Minimal APIs 实战指南:轻量级 Web API 开发从入门到项目落地 在 Web API 开发中,如何减少样板代码并提升交付效率是开发者持续关注的焦点。ASP.NET Core 作为跨平台高性能框架,其 10.0 LTS 版本在启动性能、AOT 发布等方面显著增强。Minimal APIs 是 ASP.NET Core 提供的一种轻量级 API 设计模式,通过精简路由注册、参数绑定与依赖注入流程,使开发者能用最少代码构建可运行的 HTTP 服务。它并非功能缩减,而是用更直接的方式实现数据交互,尤其适配微服务、BFF 和 Serverless 场景。该模式从基础概念入手,详细介 阅读详情

相关推荐

闭源EF6程序集IL修补实现EF Core兼容

在.NET企业级系统升级中,Entity Framework Core兼容性问题常因闭源第三方数据访问组件而受阻。其本质是程序集间类型契约不匹配,需在中间语言(IL)层面进行精准语义对齐。IL修补技术通过反编译分析、指令级替换、桥接逻辑注入与强名称重签名,实现无源码条件下的运行时契约迁移,兼顾性能提升与业务连续性。该方案适用于EF6到EF Core迁移中无法获取源码、厂商停止维护、且无法重构的高风险场景,是解决遗留系统现代化演进中‘最后一公里’兼容难题的关键工程实践。

dianlu5775的博客 448

【原创】ASP.NET Core 6使用内存数据库

Program.cs,在适当位置添加如下代码 //启用内存数据库 InMemoryDatabaseRoot _databaseRoot = new InMemoryDatabaseRoot(); string _connectionString = Guid.NewGuid().ToString(); builder.Services.AddEntityFrameworkInMemoryDatabase(); builder.Services.AddDbContext<MemDbContext>

赵庆明老师 1466

大型ASP.NET系统架构演进:从单体到微服务的实战路径

在软件工程中,架构演进是应对业务增长与技术债务的核心命题。当ASP.NET应用面临高并发、模块耦合、部署低效等典型瓶颈时,单纯性能优化已失效,必须启动结构性升级。其本质是围绕可维护性、可扩展性与团队协同能力,对分层设计、服务拆分、数据访问、缓存策略与异步通信等关键维度进行系统性重构。实践中,单体并非原罪,而是合理起点;分层架构提供可控过渡;微服务适用于组织与规模双驱动的成熟阶段;而混合架构则成为多数政企级ASP.NET系统的现实选择。本文聚焦金融、政务、电商等真实场景下的架构决策逻辑、技术选型成本测算及落地

440

VS2022 ASP.NET core Web API 示例代码解释

在ASP.NET Core Web API项目中,将代码分为模型层、控制器层、服务层和数据访问层有助于组织代码,使其更易于维护和扩展。服务层包含业务逻辑和操作,这些逻辑通常涉及多个数据模型或需要复杂的业务规则。通过这种分层结构,可以使代码更加模块化、易于维护和测试,同时清晰地分离了各个部分的职责。模型层存放数据结构和业务对象,这些对象通常反映了系统的核心业务实体。这个文件定义了一个控制器类,处理与天气预报相关的HTTP请求。数据访问层处理与数据库的交互,负责从数据库中检索和存储数据。

Sanking_M的博客 3506

手写ASP.NET Core服务框架:从宿主到中间件的深度实践

ASP.NET Core服务框架的本质是宿主生命周期、中间件委托链与依赖注入容器三大核心机制的协同。其原理在于通过IHostBuilder构建可配置的进程上下文,利用RequestDelegate链式调用实现HTTP请求管道,再依托IServiceProvider完成服务解析与作用域管理。这种设计赋予开发者对启动耗时、中间件执行顺序、DI解析路径等关键环节的完全掌控力,显著提升高并发、低延迟及信创环境下的可观测性与可定制性。本文聚焦于L0宿主层与L1管道层的手动实现,带你穿透Microsoft.Extens

世范水晶 490

.NET开发者成长三阶:从程序员到技术人员再到做人

在软件工程实践中,'程序员'是执行者,'技术人员'是系统设计者,而'做人'则是技术价值的转化者与协作信任的构建者——这一能力分层模型源于对.NET生态长期演进的观察。它揭示了技术人职业发展的本质规律:语法熟练度决定下限,系统权衡能力决定高度,而责任感、共情力与业务翻译能力则决定职业寿命。尤其在企业级开发场景中,如ASP.NET Core中间件顺序错误、EF Core延迟加载陷阱、Minimal APIs绑定失效等高频问题,其根因往往不在代码本身,而在设计阶段缺乏对上下游协作、可观测性、异常语义的前置思考。因

a6t2007的博客 518

Asp.net Core Web项目配置Swagger

本文章代码基于.Net 7的asp.net core项目开发。

不卡机的博客 647

Cat in dotNET:面向.NET 6+的轻量级全链路可观测性工具集

可观测性是现代分布式系统稳定运行的核心能力,其基础在于日志、指标与链路追踪(Tracing)三大支柱的协同。在 .NET 生态中,如何以低侵入、高性能、原生语义的方式实现端到端诊断,长期面临 OpenTelemetry 抽象泄漏、框架行为捕获不精准、异常上下文缺失等挑战。Cat in dotNET 聚焦 .NET 6+ 运行时特性,基于 DiagnosticSource 深度集成 Microsoft.Extensions 生态,提供从 HTTP 请求、EF Core 查询、Hangfire 任务到自定义业务

diaojin6880的博客 485

mysql 工具 uwp_UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

在应用中使用 SQLite 数据库来存储数据是相当常见的。在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLite PCL 之类的库,前者是 SQLite 引擎库,而后者则提供了用于操作数据库的 API ,不过自从 Windows Fall Creators Update 之后,我们有了新的选择。由于 UWP ...

weixin_39710561的博客 293

​​​​​​​​​​​​​​C#系列-EF扩展框架EntityFrameworkCore.InMemoryDatabase.Provider应用场景+实例(36)

它允许你在测试和开发环境中使用内存数据库,而不是依赖真实的数据库连接。这对于编写单元测试或集成测试特别有用,因为它提供了一个隔离的环境,可以快速地创建、配置和销毁数据库。,它配置为使用内存数据库。然后,我们添加了一些博客实体,保存到数据库中,查询它们,删除一个博客,并再次查询剩余的博客。由于使用的是内存数据库,所有的操作都是在应用程序的内存中进行的,而不是在真实的数据库服务器上。使用内存数据库进行测试可以确保测试之间的隔离,并且因为内存操作通常比磁盘操作快得多,所以测试也会运行得更快。

赵玉的专栏 914

通俗傻瓜式理清光栅化渲染和光线追踪渲染的原理

用通俗语言傻瓜式的讲清楚光栅渲染和光线追踪渲染的原理,方便没有相关理论基础的朋友理解入门。

qq_37366618的博客 2万+

在 SQL Server 上构建 JSON 原生 REST API:sql-server-samples 中 ASP.NET Core Todo 服务全解析

本文以 sql-server-samples 仓库中 [samples/features/json/todo-app/dotnet-rest-api](https://link.gitcode.com/i/0259dad4efe632ce41892c0e77922eec) 示例为骨架,系统讲解如何利用 SQL Server 2016(或更高版本)与 Azure SQL Database 内建的 J

gitblog_00403的博客 860

三维模型转变为点云模型的好工具——CloudCompare使用小记

普通三维模型能够直观地展示物体的三维全貌,但是在一些场合需要将三维模型变为相应的点云模型进行展示,而使用激光雷达等传感器采集到的点云信息往往只能反应模型表面的情况,或是使用PCL库中的可执行文件进行转换,这两种操作较为麻烦。笔者最近就遇到了这样一个情况,找到了一个名叫CloudCompare(CC)的软件,能够支持将多种文件格式的三维模型转变为点云模型。以下将本人在使用过程中所使用到的一些操作简记下来供朋友们和将来的自己参考。 一、下载 CloudCompare是一款免费软件,其可以在CloudComp

hdlwyt的博客 2万+

Asp.net Core + MongoDB零基础实战:从连接到API一键跑通

MongoDB作为主流NoSQL数据库,其文档模型与BSON序列化机制与传统关系型数据库有本质差异。理解ObjectId主键设计、BsonId与BsonRepresentation特性协同原理,是实现C#对象与MongoDB文档精准映射的技术前提。原生MongoDB.Driver驱动提供对查询意图的1:1表达能力,避免ORM抽象层带来的LINQ翻译损耗和隐式错误,特别适合初学者建立‘代码→BSON→数据库’的直观认知。在Asp.net Core中,通过合理注册IMongoClient单例、分层设计仓储与服务

天下无双 421

手把手教你用Silvaco Atlas复现GaN蓝光LED仿真:从网格划分到光谱分析全流程避坑

本文详细介绍了如何使用Silvaco Atlas进行GaN蓝光LED仿真,从网格划分到光谱分析的全流程避坑指南。重点讲解了网格划分技巧、材料参数设置、极化效应处理以及结果分析方法,帮助用户快速掌握半导体器件仿真技术,提升研发效率。

weixin_42552716的博客 223

Android音频学习(八)——AudioFlinger线程

在 PlaybackThread 的实现中,Flag 用于标识线程的特殊行为或配置。

miemie2014的博客 1398

ASP.NET Core开发实战:从入门到精通

ASP.NET Core作为微软推出的开源跨平台Web开发框架,采用模块化设计和中间件管道架构,显著提升了Web应用的性能和可扩展性。其核心原理基于依赖注入系统和轻量级HTTP服务器Kestrel,支持Windows、Linux和macOS多平台部署。在技术价值方面,ASP.NET Core的高性能特性使其请求处理能力可达Node.js的5倍,配合灵活的配置系统和强大的路由功能,特别适合构建现代化Web应用和微服务架构。实际应用场景涵盖电商平台、企业级应用和高并发API服务,通过内置的依赖注入容器和中间件管

weixin_34184561的博客 359

TCN+iTransformer时间序列预测实战:从风电功率预测到源码解析(附完整代码)

本文深入探讨了TCN与iTransformer融合模型在时间序列预测,特别是风电功率预测中的应用。通过解析iTransformer‘倒置’视角的创新架构与TCN强大的局部时序捕捉能力,文章提供了完整的融合方案设计、源码实现及实战调优经验,旨在构建更强大的下一代预测引擎。

weixin_29062671的博客 265

ASP.NET开发心得

默认的表名是Entity类名的复数形式。set;set;set;set;

tlxamulet的博客 494

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

ComfyUI 局部重绘工作流示例

本文介绍了使用ComfyUI进行图像局部重绘的基础工作流程,重点讲解如何修改人物眼睛颜色和表情。主要内容包括:1.准备工作(可选下载DreamShaperv8模型);2.加载素材图片和工作流文件;3.使用遮罩编辑器绘制需要修改的区域;4.修改提示词控制生成内容;5.调整denoise参数优化效果。教程提供了详细的提示词示例(如"smile,blackeyes"等)和参数设置建议,帮助用户通过多次尝试获得理想效果。该工作流适用于修改图像局部区域而不影响整体画面。

云域A的博客 330

C#开发者.NET演进路线图:从Core 1.0到.NET 10的四次技术跃迁

.NET是微软主导的跨平台通用开发平台,其核心运行时(CLR)与语言(C#)协同演进,形成独特的内存管理、JIT编译与异步模型。理解.NET版本迭代的本质,关键在于把握GC代际优化、AOT编译支持、跨平台ABI统一等底层原理——这些技术进步持续提升吞吐量、降低延迟、强化AI与边缘场景适配能力。在金融高频交易、车载AI推理、信创政务系统等真实工程场景中,版本选型已非简单‘越新越好’,而需结合GC行为变化、Tensor原生支持、协程调度机制等关键技术点做决策。本文聚焦.NET Core 1.0至.NET 10的

dejz8829的专栏 463

《网络安全自学教程》- MySQL脱库原理和步骤

MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段

wangyuxiang946的博客 1万+

UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

原文:UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库 在应用中使用 SQLite 数据库来存储数据是相当常见的。在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLite PCL 之类的库,前者是 SQLite 引擎库...

weixin_33896726的博客 385

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

技术框架深度对比:Finbuckle.MultiTenant与主流.NET多租户解决方案选型指南

在构建现代SaaS应用和企业级多租户系统时,技术架构师面临的核心挑战是如何在数据隔离、性能开销和开发效率之间找到最佳平衡点。Finbuckle.MultiTenant作为专为现代.NET设计的多租户中间件库,提供了一个值得深入评估的技术解决方案。本文将从技术实现原理、性能基准、扩展性设计和长期维护成本四个维度,为技术决策者提供系统化的评估框架。 ## 核心架构设计分析 ### 模块化分层架构

gitblog_00544的博客 336

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

.NET开发学习路径与实战技巧全解析

在软件开发领域,.NET框架作为微软推出的跨平台开发工具链,其核心价值在于提供统一的编程模型和丰富的类库支持。理解其工作原理需要掌握CLR运行时、MSIL中间语言等基础概念,这些技术支撑了.NET的高性能与跨平台特性。从工程实践角度看,合理的学习路径设计和开发环境配置能显著提升学习效率,特别是在处理SDK版本管理、NuGet包依赖等常见痛点时。本专栏采用三阶递进式教学法,结合ASP.NET Core实战项目,重点解决面向对象设计、Entity Framework Core优化、Web API开发等高频应用场

weixin_33428613的博客 330

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: Entity Framework Core入门(看不懂,不掌握)
下一篇: 数据可视化(Python)
DXB2021
博客等级 码龄5年 307粉丝 289原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值