首页 > 解决方案 > 从 application.json 获取连接字符串

问题描述

我有用于实体和迁移的 .Infrastructure 项目以及带有application.json文件的 .Web 项目,其中我有连接字符串

在基础设施项目中,我必须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())

这是我的解决方案结构

在此处输入图像描述

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

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

解决方案


具体来说,IDesignTimeDbContextFactory是针对类库之类的东西进行迁移,其中不涉及启动项目。如果您在迁移时可以使用显式启动项目,请查看@poke 的答案,并摆脱您的工厂,因为您不需要它。

然而,如果你想继续走这条路,你应该意识到,正如它的名字所示,这是“设计时间”,即开发。因此,从配置中获取连接字符串并没有真正意义,因为它始终是您的开发数据库。这就是为什么文档只是明确引用这个连接字符串的原因。不知道为什么每个开发人员似乎都认为他们需要在此问题上对微软进行第二次猜测。

它甚至不应该在团队环境中真正构成问题。如果您使用本地MSSQLLocalDb实例,并且您的所有开发人员都在使用 Visual Studio,那么连接字符串实际上与开发人员无关。或者,如果您在容器中启动 SQL Server 实例,那么每个开发人员都将使用相同的容器设置。

如果在某些情况下您需要允许开发人员特定的连接字符串,那么您可以为此使用配置。但是,您应该只是点击用户机密,并且您仍然不需要appsettings.json在您的 Web 项目中访问。


推荐阅读