全书目录

第十五篇:ASP.NET Core 完全指南 —— 国家级综合服务枢纽宇宙

第十四章:ASP.NET Core 与 EF Core —— 办事大厅如何连到档案总库

1 分钟 237 字 第 303 / 962 个阅读单元

这两个名字经常一起出现,但你一定要分清:

text
ASP.NET Core = 办事大厅、接待系统、请求处理系统
EF Core      = 档案总库访问系统、对象关系映射工具

它们关系非常紧密,但不是一回事。

#一个最小关系模型
csharp
public class Permit
{
    public int Id { get; set; }
    public string CitizenName { get; set; } = "";
    public List<PermitItem> Items { get; set; } = new();
}

public class PermitItem
{
    public int Id { get; set; }
    public int PermitId { get; set; }
    public string MaterialName { get; set; } = "";
    public Permit Permit { get; set; } = null!;
}
csharp
public class PermitDbContext : DbContext
{
    public PermitDbContext(DbContextOptions<PermitDbContext> options)
        : base(options)
    {
    }

    public DbSet<Permit> Permits => Set<Permit>();
    public DbSet<PermitItem> PermitItems => Set<PermitItem>();
}
#把档案库接入枢纽
csharp
builder.Services.AddDbContext<PermitDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default"));
});
#在窗口里查询档案
csharp
app.MapGet("/permits/{id:int}", async (int id, PermitDbContext db) =>
{
    var permit = await db.Permits
        .Include(p => p.Items)
        .FirstOrDefaultAsync(p => p.Id == id);

    return permit is null
        ? Results.NotFound()
        : Results.Ok(permit);
});
#关系图:ASP.NET Core 与 EF Core 如何协作
text
[HTTP 请求]
    |
    v
[Controller / Minimal API]
    |
    v
[Service 业务层]
    |
    v
[DbContext]
    |
    v
[EF Core 映射关系]
    |
    v
[SQL 数据库]
#一个很重要的工程现实

通常一条 HTTP 请求,会对应一个 ScopedDbContext
这很合理,因为“这一次办事流程里的数据库状态跟踪”应该限定在当前请求里。

如果你把 DbContext 当成全局单例,就等于把所有人的办事单都塞到一个共享桌面上,灾难只是时间问题。