如何让EF迁移仅使用主项目的appsettings.json配置
问题原因
EF Core 执行迁移、数据库更新这类设计时操作时,默认会从目标项目(即你的Persistence项目)的编译输出目录加载配置文件,不会主动跨项目去主项目目录查找配置,所以删除Persistence目录下的冗余appsettings.json后,就会抛出找不到配置文件的错误。
不需要在Persistence项目中维护重复的配置文件,以下三种方案任选其一即可实现单配置文件运行EF操作:
- 方案1:执行EF命令时显式指定启动项目为主项目
这是改造成本最低的方案,不需要调整任何项目代码,只需要在执行命令时附加参数指定启动项目,EF会自动从启动项目的运行目录加载appsettings.json配置。
如果使用dotnet CLI执行命令,在解决方案根目录运行时参考如下格式:dotnet ef database update --startup-project 你的主项目名称 --project Persistence/Persistence.csproj
如果使用Visual Studio包管理器控制台(PMC)执行命令,先将控制台的「默认项目」下拉选项切换为Persistence项目,再执行带启动项目参数的命令:Update-Database -StartupProject 你的主项目名称 - 方案2:添加EF设计时DbContext工厂,手动指定配置文件加载路径
如果不想每次执行命令都附加参数,可以在Persistence项目中实现IDesignTimeDbContextFactory<你的DbContext类名>接口,EF执行设计时操作时会优先调用该工厂创建DbContext实例,你可以在工厂代码中直接指定主项目下appsettings.json的路径,从根源上解决配置查找路径错误的问题。参考实现如下:
写完该工厂类后,所有针对Persistence项目的EF操作都会自动读取主项目的配置文件,不需要额外加命令参数。public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext> { public AppDbContext CreateDbContext(string[] args) { // 路径根据你实际的项目目录结构调整,当前默认从Persistence编译输出目录向上回溯到解决方案根目录,再拼接主项目目录 var mainProjectPath = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), "..", "..", "..", "..", "你的主项目文件夹名")); var configuration = new ConfigurationBuilder() .SetBasePath(mainProjectPath) .AddJsonFile("appsettings.json", optional: false) .Build(); var connStr = configuration.GetConnectionString("DefaultConnection"); var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>(); // 这里替换为你实际使用的数据库提供程序,例如UseNpgsql、UseMySql等 optionsBuilder.UseSqlServer(connStr); return new AppDbContext(optionsBuilder.Options); } } - 方案3:将主项目的appsettings.json作为链接文件引入Persistence项目,配置自动复制到输出目录
右键点击Persistence项目 -> 选择「添加」->「现有项」,在弹出的文件选择框中找到主项目根目录下的appsettings.json,点击「添加」按钮旁的下拉箭头,选择「添加为链接」。之后选中Persistence项目中这个链接形式的appsettings.json,在属性面板中将「复制到输出目录」选项设置为「如果较新则复制」。
配置完成后,每次编译Persistence项目时,都会自动把主项目最新的appsettings.json复制到Persistence的编译输出目录,EF执行操作时可以直接找到配置文件,全程只需要维护主项目中的单份配置即可。
内容的提问来源于stack exchange,提问作者user2099601
相关产品推荐
相关产品推荐

