EF Core DB First 如何在不同.NET Core项目配置实体关联
EF Core DB First 跨项目拆分实体与DbContext实现方案
Scaffold-DbContext 默认将所有生成文件输出到包管理器控制台选中的默认项目中,仅指定单项目内目录参数无法实现跨项目文件输出,按以下步骤配置即可达成目标:
前置配置
- 解决方案下提前创建两个独立类库:
Domain类库:新建Entities文件夹(即计划存放实体类的Entity文件夹,命名可自定义)Persistence类库:新建DbContext文件夹,为Persistence项目添加对Domain项目的项目引用,确保依赖方向为Persistence引用Domain,避免循环依赖
- 将配置了数据库连接字符串的可执行项目(通常是API/Web启动项目)设为解决方案启动项目,打开NuGet包管理器控制台,将控制台顶部的「默认项目」下拉选项选中
Persistence类库 - 为对应项目安装匹配版本的NuGet包:
- 启动项目、Persistence项目安装
Microsoft.EntityFrameworkCore.SqlServer、Microsoft.EntityFrameworkCore.Tools - Domain项目仅需安装
Microsoft.EntityFrameworkCore核心包
- 启动项目、Persistence项目安装
- 确认启动项目的
appsettings.json中已写入正确的数据库连接字符串,保证Name=connectionString可正常读取配置
执行脚手架命令
命令中跨项目路径需写相对于Persistence项目根目录的相对路径,完整命令如下:
Scaffold-DbContext -Connection Name=connectionString -Provider Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir ../Domain/Entities -Namespace Domain.Entities -ContextNamespace Persistence.DbContext -Force
参数说明
-ContextDir DbContext:默认项目选中Persistence时,该参数会将DbContext生成到Persistence项目下的DbContext文件夹内-OutputDir ../Domain/Entities:从Persistence项目根目录向上返回一层到解决方案根目录,再进入Domain项目的Entities文件夹,所有实体类将生成到该路径下-Namespace Domain.Entities:为生成的实体类指定匹配Domain项目的命名空间,与实体存放路径对应-ContextNamespace Persistence.DbContext:为生成的DbContext指定匹配Persistence项目的命名空间,与上下文存放路径对应
生成后校验
- 实体类全部存放在Domain项目的Entities文件夹中,命名空间为
Domain.Entities,无额外外部依赖 - DbContext存放在Persistence项目的DbContext文件夹中,会自动添加对
Domain.Entities的引用,所有DbSet<T>属性的实体类型均来自Domain项目,无需手动修改引用关系 - 后续需要同步数据库结构更新实体时,直接重新执行上述命令即可,
-Force参数会自动覆盖已生成的旧文件,不会破坏项目引用
常见问题处理
- 执行命令提示路径不存在:先确认解决方案下两个类库的目录层级,若类库未和解决方案文件同级存放,对应调整
-OutputDir后的相对路径层级即可 - 提示找不到连接字符串:检查启动项目是否设置正确,确认启动项目的配置文件中存在对应名称的连接字符串,不要将类库项目设为启动项目执行脚手架命令
- 出现循环引用报错:检查是否误给Domain项目添加了对Persistence的引用,删除该引用即可,正确依赖方向应为启动项目引用Persistence,Persistence引用Domain
内容的提问来源于stack exchange,提问作者Samvel Yeghikyan
相关产品推荐
相关产品推荐

