是否可在Scaffolding上下文时自动开启导航AutoInclude?
解决EF Core Scaffold导航属性自动包含不被覆盖的方案
方案1:用分部类扩展上下文配置
Scaffold生成的DbContext是partial类,我们可以单独新建一个分部类文件来补充配置,不会被后续Scaffold操作覆盖。
比如新建YourDbContext.Extensions.cs文件,写入以下代码:
public partial class YourDbContext { partial void OnModelCreatingPartial(ModelBuilder modelBuilder) { // 为Contract的Cards导航配置自动包含 modelBuilder.Entity<Contract>() .Navigation(x => x.Cards) .AutoInclude(); // 后续新增实体的导航配置也可以加在这里 } }
EF Core默认会在自动生成的OnModelCreating方法里调用OnModelCreatingPartial分部方法,我们实现这个方法来添加自定义配置,完全不会被Scaffold覆盖。
方案2:全局批量配置所有导航自动包含
如果需要所有实体的导航属性都自动包含,不用逐个配置,可以在分部类里批量设置:
public partial class YourDbContext { partial void OnModelCreatingPartial(ModelBuilder modelBuilder) { foreach (var entityType in modelBuilder.Model.GetEntityTypes()) { foreach (var navigation in entityType.GetNavigations()) { navigation.SetIsAutoInclude(true); } } } }
这样不管后续新增多少表,所有导航属性都会自动开启AutoInclude。
方案3:自定义Scaffold模板(适合团队统一规范)
如果想让Scaffold自动生成AutoInclude配置,可以修改EF Core的Scaffold模板:
- 找到EF Core的Scaffold模板文件(通常在NuGet包的
templates目录下,比如EntityType.cshtml或DbContext.cshtml) - 修改模板逻辑,让它在生成实体配置时自动添加
Navigation(x => x.NavProp).AutoInclude()的代码 - 把修改后的模板放到项目的
Templates目录下,后续Scaffold就会用自定义模板生成代码
这个方法适合需要统一团队开发规范的场景,一劳永逸解决自动生成的问题。
内容的提问来源于stack exchange,提问作者user7849697
相关产品推荐
相关产品推荐

