这两个名字经常一起出现,但你一定要分清:
ASP.NET Core = 办事大厅、接待系统、请求处理系统
EF Core = 档案总库访问系统、对象关系映射工具它们关系非常紧密,但不是一回事。
#一个最小关系模型
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!;
}public class PermitDbContext : DbContext
{
public PermitDbContext(DbContextOptions<PermitDbContext> options)
: base(options)
{
}
public DbSet<Permit> Permits => Set<Permit>();
public DbSet<PermitItem> PermitItems => Set<PermitItem>();
}#把档案库接入枢纽
builder.Services.AddDbContext<PermitDbContext>(options =>
{
options.UseSqlServer(builder.Configuration.GetConnectionString("Default"));
});#在窗口里查询档案
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 如何协作
[HTTP 请求]
|
v
[Controller / Minimal API]
|
v
[Service 业务层]
|
v
[DbContext]
|
v
[EF Core 映射关系]
|
v
[SQL 数据库]#一个很重要的工程现实
通常一条 HTTP 请求,会对应一个 Scoped 的 DbContext。
这很合理,因为“这一次办事流程里的数据库状态跟踪”应该限定在当前请求里。
如果你把 DbContext 当成全局单例,就等于把所有人的办事单都塞到一个共享桌面上,灾难只是时间问题。