【发布时间】:2018-04-13 17:22:09
【问题描述】:
我正在使用 ASP.NET Core 2.0 构建应用程序,但遇到 EntityFramework 迁移问题。
我的 DbContext 在一个单独的项目中 (SolutionName\ProjectNamePrefix.Data),因此我为 IDesignTimeDbContextFactory 接口创建了一个实现。
我想为不同的环境使用不同的连接字符串,为此我需要appsettings.json。
所以经过快速搜索后,我发现我可以在CreateDbContext 函数中创建一个新的IConfigurationRoot 对象,如下所示:
https://codingblast.com/entityframework-core-idesigntimedbcontextfactory/
我添加了它,然后为了测试,尝试从数据项目根文件夹运行dotnet ef migrations list -c MyContext。
然后我得到以下错误:
The configuration file 'appsettings.json' was not found and is not optional. The physical path is 'C:\dev\*SolutionName*\*ProjectNamePrefix*.Data\bin\Debug\netcoreapp2.0\appsettings.json'.
所以,基本上,我尝试了 3 个选项来获取正确的根路径:
Directory.GetCurrentDirectory();-
env.ContentRootPath;(IHostingEnvironment对象,我在这里找到了一种方法:https://github.com/aspnet/Home/issues/2194) AppDomain.CurrentDomain.BaseDirectory;
它们都返回了相同的..\bin\debug\netcoreapp2.0\ 路径。当我从 VS 运行 Data 项目时,前两个选项为我提供了正确的项目根文件夹。
有没有办法获取正确的项目内容根文件夹?
因为当我将 --verbose 添加到 EF 命令时,它会注销一行:
Using content root 'C:\dev\FitsMeIdentity\FitsMeIdentity.Data\'.
所以我知道 EF 不知何故知道项目根目录,但上面提到的所有选项都会返回已构建应用程序的路径。
我发现唯一可行的选择是将Copy output to root folder 更改为Copy always,但从这里发现:https://www.benday.com/2017/02/17/ef-core-migrations-without-hard-coding-a-connection-string-using-idbcontextfactory/ 这不是一个好主意。
起初我什至考虑为 IDesignTimeDbContextFactory 实现创建一个构造函数,该实现将 IOptions 作为参数但不起作用,遇到了与此处解释的相同的问题: Injecting Env Conn String into .NET Core 2.0 w/EF Core DbContext in different class lib than Startup prj & implementing IDesignTimeDbContextFactory
【问题讨论】:
标签: asp.net entity-framework entity-framework-core asp.net-core-2.0 ef-core-2.0