VS2019下EF Core结合SQLite用于UWP,.NET Standard 2.0项目无法使用迁移如何解决
解决方案
EF Core迁移工具无法直接针对.NET Standard类库执行,本质原因是.NET Standard是API规范而非可运行的实现框架,你只需要指定一个可运行的项目作为迁移执行的宿主即可解决问题,具体操作步骤如下:
步骤1:调整项目依赖配置
- 存放DbContext的.NET Standard 2.0类库需要安装NuGet包:
Microsoft.EntityFrameworkCore、Microsoft.EntityFrameworkCore.Sqlite、Microsoft.EntityFrameworkCore.Design,所有EF Core相关包需保持版本一致,建议使用3.1.x或5.x LTS版本,更高版本不兼容UWP运行时。 - UWP主项目引用该.NET Standard类库,同时UWP项目安装NuGet包:
Microsoft.EntityFrameworkCore.Tools,版本和类库安装的EF Core包完全一致。
步骤2:执行迁移时指定启动项目
打开Visual Studio的包管理器控制台,将控制台顶部的「默认项目」切换为存放DbContext的.NET Standard类库,执行迁移命令时通过-StartupProject参数指定UWP项目作为执行宿主:
- 添加迁移命令:
Add-Migration InitialCreate -StartupProject 你的UWP项目名称 - 同步到数据库命令:
Update-Database -StartupProject 你的UWP项目名称
如果你使用dotnet CLI执行迁移,对应命令格式为:
dotnet ef migrations add InitialCreate --project 你的.NET Standard类库路径 --startup-project 你的UWP项目路径 dotnet ef database update --project 你的.NET Standard类库路径 --startup-project 你的UWP项目路径
步骤3:异常兼容处理
如果执行迁移时提示找不到DbContext的有效构造函数,可以在.NET Standard类库中新增设计时工厂类,该类仅用于设计时迁移执行,不会影响正式运行逻辑:
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Design; using Microsoft.Data.Sqlite; namespace 你的类库命名空间 { public class AppDbContextDesignTimeFactory : IDesignTimeDbContextFactory<你的DbContext类名> { public 你的DbContext类名 CreateDbContext(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<你的DbContext类名>(); optionsBuilder.UseSqlite("Data Source=temp.db"); return new 你的DbContext类名(optionsBuilder.Options); } } }
注意事项
- UWP项目的最低支持版本需满足EF Core版本要求,例如EF Core 3.1要求UWP最低版本为10.0.16299
- 生成的迁移文件会自动存储在.NET Standard类库的Migrations目录下,无需手动调整
内容的提问来源于stack exchange,提问作者Talin Sharma
相关产品推荐
相关产品推荐

