【问题标题】:Get connection string from application.json从 application.json 获取连接字符串
【发布时间】:2019-02-25 15:11:19
【问题描述】:

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

这是我的解决方案结构

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

【问题讨论】:

  • 为什么不传递连接字符串?工厂需要关心应用程序范围的配置文件,并且可能在稍后的过程中弄清楚正在启动哪个环境,这有点奇怪。只需从您的 Startup 类传递连接字符串。
  • 好的,如何将它传递给 .Infrastructure 项目? @huysentruitw
  • 使用依赖注入并创建扩展方法并传递连接字符串,例如我参考我的一个项目here
  • 然后AddData被Host项目中的Startup类调用:see here
  • 这也意味着删除IDesignTimeDbContextFactory 并保持简单:)

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    要为库项目运行迁移但使用来自不同项目的配置连接字符串,您需要在运行迁移命令时指定启动项目。

    例如,添加迁移:

    cd src\TooSeeWeb.Infrastructure
    dotnet ef migrations add ExampleMigration -s ..\TooSeeWeb
    

    这会将..\TooSeeWeb 指定为启动项目,因此迁移将像所有与EF 相关的内容实际上都在该Web 项目中一样运行。

    同样,-s--startup-project 参数也可以与其他命令一起使用,例如dotnet ef database update -s ..\TooSeeWeb.

    【讨论】:

    • 感谢您的帮助。
    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2013-11-08
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多