从application.json获取连接字符串

时间:2019-02-25 15:11:20

标签: c# asp.net .net asp.net-core .net-core

我有用于实体和迁移的.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())

这是我的解决方案结构

enter image description here

如何从中获取连接字符串?

2 个答案:

答案 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