Entity Framework Core 相关模式的整理,涵盖数据访问、迁移、关系、性能与最佳实践。以下内容以 .NET / C# 为背景。
一、DbContext 设置 以主构造函数接收 DbContextOptions<AppDbContext> 并继承 DbContext。通过 DbSet<T> 暴露实体集合(Product、Order、Customer),并在 OnModelCreating 中调用 modelBuilder.ApplyConfigurationsFromAssembly,从当前程序集应用所有实体配置。
二、实体配置(Fluent API) 实现 IEntityTypeConfiguration<Product>,在 Configure 方法中使用 EntityTypeBuilder 配置:HasKey 指定主键;Property 设置最大长度(Name 200 且必填)、精度(Price precision 18,2)、长度(Sku 50);HasIndex 为 Sku 建唯一索引;HasOne/WithMany/HasForeignKey 定义与 Category 的一对多关系并设置 OnDelete(DeleteBehavior.Restrict);HasMany/WithMany 配合 UsingEntity 定义与 Tags 的多对多关系,中间表名为 ProductTags。
三、迁移 使用 dotnet ef 命令行工具,可指定 --project 与 --startup-project:migrations add 添加迁移(如 InitialCreate);database update 更新数据库;migrations script --idempotent 生成 SQL 脚本;migrations remove 移除尚未应用的最后一个迁移。
四、查询模式
- 基础 CRUD:读取时始终使用异步,并在只读查询中使用 AsNoTracking,可结合 Where、OrderBy、ToListAsync(ct);投影查询(Select 到 ProductDto)为最佳性能做法;创建使用 Add 后 SaveChangesAsync;更新与删除先通过 FindAsync([id], ct) 获取实体,再修改属性或调用 Remove,最后 SaveChangesAsync。
- 预加载:使用 Include 加载 Customer 与 Items,并链式 ThenInclude 加载 Product,配合 AsSplitQuery 防止笛卡尔积。
- 编译查询:针对热点路径,用 EF.CompileAsyncQuery 定义静态查询委托,接收 AppDbContext、id 与 CancellationToken,返回实体。
- 批量操作(.NET 10):ExecuteUpdateAsync 可在不加载实体的情况下批量更新(如按条件设置 CategoryId);ExecuteDeleteAsync 可批量删除(如删除已软删除且超过截止时间的记录)。
五、性能建议 只读查询始终使用 AsNoTracking();使用 Select() 投影只加载所需列;多个 Include 时使用 AsSplitQuery();为高频查询列添加索引;批量操作使用 ExecuteUpdateAsync/ExecuteDeleteAsync;频繁执行的查询使用编译查询;不要在 Where() 之前调用 ToList()(会加载整表);在仓库中使用 IQueryable,在服务层再物化。
六、适用场景与限制 适用于基于 C#/.NET 的应用数据访问层开发,尤其是需要以代码优先方式定义模型、管理数据库迁移与优化查询性能的项目。关于该条目的收费、价格、平台限制等信息暂未提供。