使用外部 connectionStrings.config 文件的 WebPublish 代码优先迁移

WebPublish Code-First Migrations with external connectionStrings.config file

我目前有一个项目利用 Entity Framework 代码优先迁移和 Web 发布,其中 connectionStrings 存储在 web.config 文件中。

是时候将 connectionStrings 移到 web.config 之外了,因此我们将它们放入 connectionString.config 文件中,并让 slowcheetah 在 webpublish 上转换它们。

connectionStrings.config

<connectionStrings>
    <!-- Testing Databases -->
    <add
        connectionString="server=testserver;database=testdatabasename;user id=someid;password=*******"
        name="dbname"
        providerName="System.Data.SqlClient"
    /> 
</connectionStrings>

web.config 相关部分

  <connectionStrings configSource="config\connectionStrings.config">
  </connectionStrings>

现在,当我加载 Web 发布对话框(构建 -> 发布项目)时,在设置选项卡中我收到错误

No Databases found in the project

这表明对话框不够智能,无法查看 configSource 并从那里加载数据。我可以确认 connectionStrings 已在我的开发环境中正确加载,我还可以确认 slowcheetah 正在将配置正确转换到它的生产环境中。

有没有办法让 Visual Studio Publish 查看我的配置配置,并允许代码优先迁移?

我也有同样的问题,也使用 Entity Framework 6 代码首先在一个单独的项目中使用 Visual Studio 2013 Update 4 和通过 connectionStrings 使用类似的共享方法在 .net 4.5 下发布的项目' configSource 属性。

我列出这些细节是因为它会引起一场完美风暴。为了摆脱它,我遇到了一些不同的错误,并且不得不根据 EF blog they know it's a mess and are re-factoring their approach 以几种不同的方式破解它。这是我能想到的最好的(这里是龙):

发布向导似乎不理解 configSource,所以我在 web.config 中将其从 conectionStrings 中删除,留下一个空元素(您也可以完全删除它,但我觉得现有但空的元素最好带有评论更合适)。为了让它在本地工作,我添加了一个连接工厂,让事情在调试模式下(本地)工作,并让发布向导找到数据库迁移。我使用了一个工厂,因为 connectionString 总是取代一个工厂,我需要滥用它来使项目在任何转换之前工作。还要确保传递给 dbcontext 构造函数的字符串又名 "connectionStringOrDatabaseName" 既是连接字符串又是数据库名称(使工厂生成的数据库与连接字符串 db 匹配)。

现在它找到了数据库并在本地工作,但它并没有真正使用您的 sharedConfig(因此不会总是在发布时工作)。为了解决这个问题,我随后使用 web.config 转换为 xsd:Replace/Insert empty/missing connectionStrings 元素,其中一个使用 configSource。如果您现在尝试发布,您将 运行 陷入 invalid connectionStrings element is produced.

的问题

尽管距离如此之近,但我无法 find/figure 直接解决该问题,因此我不得不采用另一种解决方法:我 created a custom transformation 又名 xsd:Import 当给出configSource 属性将父元素替换为另一个文件中的元素,我将把实现作为练习留给 reader.