如何使用Scaffold-DbContext分项目生成DbContext与实体类
分离生成DbContext与实体类到不同项目的解决方案
我太懂手动拆分的麻烦了,其实用Scaffold-DbContext的参数组合就能轻松实现分离,再也不用手动删冗余内容。下面是具体的操作步骤:
1. 先搞定项目依赖
确保你的DbContext项目(比如叫MyApp.Data)已经引用了实体类项目(比如叫MyApp.Entities),这样DbContext才能正常访问实体类。同时两个项目要安装对应的EF Core NuGet包:
- 实体项目:安装
Microsoft.EntityFrameworkCore - DbContext项目:安装
Microsoft.EntityFrameworkCore.Design和对应数据库的提供者包(比如用SQL Server的话就装Microsoft.EntityFrameworkCore.SqlServer)
2. 生成实体类到实体项目
打开Package Manager Console,切换到DbContext项目(我们从这里执行命令更方便),运行以下命令:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "../MyApp.Entities/Models" -Context ""
-OutputDir:指定实体类生成到实体项目的目标目录(这里用相对路径,你可以根据自己的项目结构调整)-Context "":空值表示不生成DbContext,只产出实体类
如果后续数据库结构有变更,加-Force参数就能直接覆盖旧的实体类:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "../MyApp.Entities/Models" -Context "" -Force
3. 生成DbContext到DbContext项目
同样在Package Manager Console的DbContext项目下,执行这条命令:
Scaffold-DbContext "你的数据库连接字符串" Microsoft.EntityFrameworkCore.SqlServer -ContextDir . -Context "MyAppDbContext" -NoEntities -Namespace "MyApp.Data" -EntityNamespace "MyApp.Entities.Models"
参数解释:
-NoEntities:跳过生成实体类,直接复用实体项目里已有的类-ContextDir:指定DbContext生成的目录,.表示当前项目根目录,也可以指定子文件夹比如./Data-Context:设置DbContext的类名-Namespace:定义DbContext所在的命名空间-EntityNamespace:指定实体类的命名空间,这样DbContext会自动引用该命名空间,不用手动加using
后续更新DbContext时,同样加-Force参数覆盖旧文件就行。
额外小提示
- 相对路径要根据你的项目层级调整,比如如果两个项目是同级的,用
../实体项目名/目录就没问题 - 如果你习惯用.NET CLI而不是Package Manager Console,命令格式类似,只是参数保持统一短横线:
dotnet ef dbcontext scaffold "你的连接字符串" Microsoft.EntityFrameworkCore.SqlServer --output-dir ../MyApp.Entities/Models --context ""
内容的提问来源于stack exchange,提问作者yasserpulido
相关产品推荐
相关产品推荐

