.NET分层项目拆分后EF Core迁移无法生成到指定类库问题
场景说明
应用拆分多项目分层结构前,Models、Database相关代码全部存放在BulkyBookWeb项目内,拆分后的解决方案结构如下:
BulkyBook ├─ BulkyBook.DataAccess ├─ BulkyBook.Models ├─ BulkyBook.Utility └─ BulkyBookWeb
各项目职责划分:
- BulkyBook.DataAccess:存放
ApplicationDbContext、迁移文件、仓储相关代码 - BulkyBook.Models:存放实体模型定义
- BulkyBook.Utility:存放通用工具类
- BulkyBookWeb:Web应用入口项目
在BulkyBookWeb项目路径下直接执行迁移命令dotnet ef migrations add AddCoverTypeToDatabase时,会抛出如下报错:
Your target project 'BulkyBookWeb' doesn't match your migrations assembly 'BulkyBook.DataAccess'. Either change your target project or change your migrations assembly. Change your migrations assembly by using DbContextOptionsBuilder. E.g. options.UseSqlServer(connection, b => b.MigrationsAssembly("BulkyBookWeb")). By default, the migrations assembly is the assembly containing the DbContext. Change your target project to the migrations project by using the Package Manager Console's Default project drop-down list, or by executing "dotnet ef" from the directory containing the migrations project.
此前尝试将MigrationsAssembly配置为BulkyBookWeb后,迁移文件夹生成在了BulkyBookWeb项目内,不符合预期需求:基于BulkyBook.Models中定义的模型,将迁移文件生成到BulkyBook.DataAccess项目的Migrations文件夹中。
正确配置步骤
1. 修正DbContext注册的迁移程序集配置
修改BulkyBookWeb项目中Program.cs的DbContext注入代码,将迁移程序集指向BulkyBook.DataAccess:
builder.Services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer( builder.Configuration.GetConnectionString("AppDbContext"), b => b.MigrationsAssembly("BulkyBook.DataAccess") ) );
注意:此处填写的BulkyBook.DataAccess为DataAccess项目的程序集名称,默认与项目名一致,若项目csproj中自定义了AssemblyName,需替换为实际配置值。
该配置的作用是告知EF Core运行时,到指定程序集加载已生成的迁移文件,避免运行时抛出找不到迁移文件的异常。
2. 执行迁移命令时显式指定项目参数
不要在BulkyBookWeb项目目录下直接执行无参数的ef命令,切换到解决方案根目录执行命令,通过参数显式指定启动项目和迁移存放的目标项目:
# 生成迁移文件 dotnet ef migrations add AddCoverTypeToDatabase --project BulkyBook.DataAccess --startup-project BulkyBookWeb # 同步迁移到数据库 dotnet ef database update --project BulkyBook.DataAccess --startup-project BulkyBookWeb
参数说明:
--project(简写-p):指定迁移文件生成的目标项目,传入BulkyBook.DataAccess后,Migrations文件夹会自动生成在该项目根目录下--startup-project(简写-s):指定承载应用配置(数据库连接字符串、依赖注入配置等)的启动项目,此处传入入口项目BulkyBookWeb即可
如果使用Visual Studio内置的包管理器控制台(PMC)执行迁移,无需添加命令行参数:将控制台顶部的「默认项目」下拉选项切换为BulkyBook.DataAccess,保持解决方案启动项目为BulkyBookWeb,直接执行
Add-Migration AddCoverTypeToDatabase、Update-Database命令即可。
内容的提问来源于stack exchange,提问作者Vagner Wentz

