fluent api 是 ef core 中配置复合外键、主控方、级联删除、多视图配置及导航加载行为的唯一可靠方式,数据注解无法覆盖这些关键场景。

为什么不能只靠数据注解配置外键和关系
数据注解(如 [ForeignKey]、[Required])写起来快,但覆盖不了 EF Core 的关键映射场景。比如:无法指定复合外键、无法配置双向导航属性中哪边是主控方、无法禁用级联删除、也无法为同一实体类型注册多个不同配置(如软删视图 vs 全量视图)。这些必须用 Fluent API。
-
[ForeignKey]只能绑定一个属性名,不能表达OrderId + TenantId这样的组合外键 - 一对多关系中,若
Order有ICollection<item></item>,而Item也有Order导航属性,EF Core 默认会按“发现的首个外键”推断主从,结果可能错配OnDelete行为 - 数据注解无法关闭导航属性的自动加载(
.UseNavigation()或.AutoInclude(false)),Fluent API 才能精确控制
OnModelCreating 里怎么写一对多关系才不翻车
最常见的坑是漏掉 .HasForeignKey() 或误用 .HasPrincipalKey()。EF Core 不会报错,但生成的迁移里外键列名、约束名、是否可空全都不对,运行时查不到关联数据或插入失败。
- 确保在
modelBuilder.Entity<item>()</item>链式调用中显式声明外键属性:.HasForeignKey(i => i.OrderId),而不是只写.HasOne(i => i.Order).WithMany(o => o.Items) - 如果外键属性是可空的(比如订单可取消),必须加
.IsRequired(false),否则迁移会生成NOT NULL列,导致插入时报错 - 想让删除 Order 时不删 Item,得加
.OnDelete(DeleteBehavior.Restrict);默认是Cascade,容易误删数据 - 别在
HasOne那一侧反向配置外键(比如在Order类里写.HasMany(o => o.Items).WithOne(i => i.Order)),这会覆盖前面的配置,且不报错
如何把 Fluent API 拆到独立配置类里
把所有配置堆在 OnModelCreating 里,5 个实体就难维护。EF Core 支持分拆,但要注意两个关键点:类型必须实现 IEntityTypeConfiguration<t></t>,且必须显式注册——不会自动扫描。
- 新建类
ItemConfiguration,实现IEntityTypeConfiguration<item></item>,在Configure方法里写builder.HasKey(i => i.Id)等逻辑 - 在
OnModelCreating中调用:modelBuilder.ApplyConfiguration(new ItemConfiguration()),或批量加载:modelBuilder.ApplyConfigurationsFromAssembly(typeof(ItemConfiguration).Assembly) - 注意:
ApplyConfigurationsFromAssembly只扫描实现了IEntityTypeConfiguration的 public 类,内部类、泛型类、没实现该接口的类都会被忽略 - 配置类里不能访问
DbContext实例(比如this.Set<user>()</user>),所有配置必须通过EntityTypeBuilder完成
Fluent API 配置后迁移不生效?检查这三个地方
改完 OnModelCreating,执行 dotnet ef migrations add Init 却发现表结构没变,大概率是以下三处之一卡住了。
- 上下文类继承了错误的基类:确认是
DbContext,不是IdentityDbContext或自定义抽象类,且构造函数正确传入DbContextOptions - 没有调用父类的
base.OnModelCreating(modelBuilder)—— 虽然多数情况不影响,但某些第三方扩展(如 EFCore.NamingConventions)依赖这个钩子 - 实体类属性名变更后,旧迁移已生成过对应列,EF Core 不会自动重命名字段;必须手动编辑迁移文件里的
migrationBuilder.RenameColumn,或删掉旧迁移重建
最隐蔽的问题是:某个配置类被编译进另一个程序集,而 ApplyConfigurationsFromAssembly 加载的是启动项目的 Assembly,结果配置根本没跑。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











