【问题标题】:Select build configuration DbContext migration选择构建配置 DbContext 迁移
【发布时间】:2015-11-04 00:27:27
【问题描述】:

我可以在我的网络配置中更新数据库:

Update-Database -Verbose 

部署数据库时,我在 web.config.debug 转换文件中定义了不同的连接字符串。

如何为构建配置使用正确的连接字符串?

例如:

Web.config:

<configuration>
    <connectionStrings>
        <add name="MyConnection" 
             connectionString="My_Local_Connection_String"/>
    </connectionStrings>
</configuration>

Web.config.Debug:

<configuration>
    <connectionStrings>
        <add name="MyConnection" 
             connectionString="My_Debug_Connection_String" 
             xdt:Transform="SetAttributes" 
             xdt:Locator="Match(name)"/>
    </connectionStrings>
</configuration>

Web.config.Release:

<configuration>
    <connectionStrings>
        <add name="MyConnection" 
             connectionString="My_Release_Connection_String" 
             xdt:Transform="SetAttributes"
             xdt:Locator="Match(name)"/>
    </connectionStrings>
</configuration>

一旦我证明本地迁移没问题,我需要在连接字符串 Web.config.Debug 上进行相同的迁移,并且假设发布版本有效。

如何告诉 EF 使用哪个配置转换?

【问题讨论】:

  • 您的意思是您的 web.config 有您的测试数据库连接字符串,并且您希望您发布的项目用您的生产连接字符串替换它。因为仅供参考,转换仅适用于发布,而不是构建。
  • 您能更准确地描述您的问题吗?构建配置的正确连接字符串是什么意思?
  • @ThomasBoby 是的,我知道它们是在发布时执行的。那么,是从配置文件中复制连接字符串还是有更好的方法?

标签: .net entity-framework entity-framework-migrations


【解决方案1】:

可能有更好的解决方案,但我想到的一个简单的解决方案是:

  1. 将所有连接字符串以适当的名称(即 MyApplication-Debug、MyApplication-Release)放入 web.config 中
  2. 在迁移配置类中,使用预处理器#if指定连接字符串,如

    internal sealed class Configuration : DbMigrationsConfiguration<MyApplicationContext>
    {
       public Configuration()
       {
          AutomaticMigrationsEnabled = false;
    
          string connectionStringName;
    #if DEBUG
          connectionStringName = "MyApplication-Debug";
    #else
          connectionStringName = "MyApplication-Release";
    #endif
    
          TargetDatabase = new DbConnectionInfo(connectionStringName);
      }
    }
    

【讨论】:

  • 虽然这样可行,但会很糟糕。其他开发人员会厌恶地从我身边走过。
  • 为什么?这会做你想做的事。如果它是错误的,也许你必须改变你的要求。作为记录,我永远不会将迁移应用到发布数据库。
  • 因为现在我有一个需要了解所有构建配置的配置。我的连接名称在环境中并不常见。每次我有一个构建配置时,我都会添加另一个预编译 if。你是对的,它在功能上是可行的,但它不是一个好的解决方案。
  • 您在问题中只提到了调试和发布。但无论如何,每个环境/构建配置都需要一个连接字符串,您需要将它存储在某个地方,并且您需要“某物”来为每个配置选择正确的连接字符串。有很多方法可以做到这一点,但很难提出任何建议,因为我不知道你认为什么“好”,或者什么不会让你的开发人员感到反感。我认为你应该更好地解释你的要求。
  • 我有调试和发布转换,所以总共三个配置。 Debug 常量不是一个好的选择,因为它被诊断工具使用。您可能想为一些任意构建打开它。
【解决方案2】:

如果您使用的是 dotnet CLI,则可以通过

指定目标构建配置

--configuration

参数,这将导致工具选择正确的连接字符串。

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 2020-09-04
    • 2017-05-06
    • 2016-12-13
    • 2020-12-05
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多