我有用于实体和迁移的.Infrastructure项目,以及带有application.json
文件的.Web项目,其中有连接字符串
在Infrastrusture项目中,我有ApplicationContextFactory
来运行迁移
这是代码
public class ApplicationContextFactory: IDesignTimeDbContextFactory<ApplicationDbContext>
{
public ApplicationDbContext CreateDbContext(string[] args)
{
IConfigurationRoot configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
var connectionString = configuration.GetConnectionString("DefaultConnection");
optionsBuilder.UseSqlServer(connectionString);
return new ApplicationDbContext(optionsBuilder.Options);
}
}
该字符串不起作用,因为application.json文件位于.Web项目中。
.SetBasePath(Directory.GetCurrentDirectory())
这是我的解决方案结构
如何从中获取连接字符串?
答案 0 :(得分:2)
具体来说,IDesignTimeDbContextFactory
用于在不涉及启动项目的类库之类的环境中进行迁移。如果您在迁移时可以使用显式启动项目很好,请参见@poke的答案,并在不需要时放弃工厂。
但是,如果您想继续走这条路,您应该意识到,顾名思义,这是为了“设计时间”,即开发。因此,从配置中获取连接字符串实际上没有任何意义,因为它将始终是您的开发数据库。这就是为什么文档仅显式引用此连接字符串的原因。不确定为什么每个开发人员似乎都认为他们需要对此进行二次猜测。
它甚至不应该在团队环境中构成问题。如果您使用本地MSSQLLocalDb
实例,并且所有开发人员都在使用Visual Studio,则连接字符串实际上是开发人员不可知的。或者,如果您在一个容器中启动一个SQL Server实例,那么每个开发人员都将使用相同的容器设置。
如果在某些情况下需要允许开发人员特定的连接字符串,则可以为此使用配置。但是,您应该只是点击“用户密钥”,并且仍然不需要访问Web项目中的appsettings.json
。
答案 1 :(得分:1)
为了运行库项目的迁移,但使用其他项目中配置的连接字符串,则需要在运行迁移命令时指定启动项目。
例如,要添加迁移:
cd src\TooSeeWeb.Infrastructure
dotnet ef migrations add ExampleMigration -s ..\TooSeeWeb
这将指定..\TooSeeWeb
作为启动项目,因此迁移将像EF相关的所有内容实际上都在该Web项目中一样运行。
类似地,该-s
或--startup-project
参数也可以与其他命令一起使用,例如dotnet ef database update -s ..\TooSeeWeb
。