【问题标题】:Executing asp.net core EF migration in a class library without hardcoding connection string在没有硬编码连接字符串的类库中执行 asp.net core EF 迁移
【发布时间】:2017-08-19 23:21:46
【问题描述】:

我想在不同的环境中执行迁移。我正在使用 Entity Framework 和 ASP.NET Core。现在我有这个:

public class TemporaryDbContextFactory : IDbContextFactory<ApplicationDbContext>
{
    public ApplicationDbContext Create(DbContextFactoryOptions options)
    {
        var builder = new DbContextOptionsBuilder<ApplicationDbContext>();
        builder.UseSqlServer("Data Source=.\\LOCALHOST;Initial Catalog=MyDB;Integrated Security=True;MultipleActiveResultSets=true");

        return new ApplicationDbContext(builder.Options);
    }
}

此代码位于将数据库交互与服务器代码分开的 DAL 类库中。

执行迁移时可以使用它,但我真的不喜欢这样。

这里的问题是我使用本地数据库进行开发,但我们也有一个开发服务器和一个具有不同连接字符串的登台服务器。我无法做到的是找到一种方法不在该类中对连接字符串进行硬编码。

有没有办法为不同的环境配置连接字符串,并在执行迁移时指示使用哪个?

【问题讨论】:

    标签: c# asp.net entity-framework asp.net-core environment-variables


    【解决方案1】:

    是的,您可以为此使用环境变量。

    这就是为什么你有appsettings.&lt;EnvironmentName&gt;.json

    Configuration in ASP.NET Core
    不错的微软文章 aboutWorking with multiple environments


    仅供参考
    Environment.GetEnvironmentVariable

    【讨论】:

    • 我知道我可以像这样配置它,这就是我所做的,但是我在执行迁移时如何指定我所在的环境?
    • @AntoineThiry 在执行迁移之前设置 ASPNETCORE_ENVIRONMENT
    • 谢谢,我错过了那部分,不应该问这个明显的问题......
    【解决方案2】:

    您需要将DbContextOptionsBuilder&lt;ApplicationDbContext&gt; 注入到您的工厂构造函数中,然后在主应用程序的Startup.cs 中配置DbContext

    public class TemporaryDbContextFactory : IDbContextFactory<ApplicationDbContext>
    {
        private readonly DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder;
    
        public TemporaryDbContextFactory(DbContextOptionsBuilder<ApplicationDbContext> optionsBuilder)
        {
            if(optionsBuilder==null)
                throw new ArgumentNullException(nameof(optionsBuilder));
    
            this.optionsBuilder = optionsBuiler;
        }
    
        public ApplicationDbContext Create(DbContextFactoryOptions options)
        {
            return new ApplicationDbContext(optionsBuilder.Options);
        }
    }
    

    在 Startup.cs 中:

    services.AddDbContext<ApplicationDbContext>(options => {
        options.UseSqlServer(Configuration.GetConnectionString("MyConnectionString"));
    });
    

    Configuration.GetConnectionString("MyConnectionString")Configuration["ConnectionStrings:MyConnectionString"] 的简写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2021-11-22
      • 2019-09-22
      • 2018-05-08
      • 2020-10-25
      • 1970-01-01
      • 2011-10-24
      相关资源
      最近更新 更多