现在是时候将connectionStrings移到web.config之外了,因此我们将它们放入connectionString.config文件中,并让它们在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 Publish(Build – > Publish Project)的对话框时,在设置选项卡中我收到错误
No Databases found in the project
这向我表明对话框不够智能,无法查看configSource并从那里加载数据.我可以确认在我的开发人员环境中正确加载了connectionStrings,我还可以确认slowcheetah正在将配置转换为它的生产环境.
解决方法
我列出了这些细节,因为它会引起一些完美的风暴.试图摆脱它我遇到了一些不同的错误,不得不按照EF blog they know it’s a mess and are re-factoring their approach的不同方式破解它.这是我能想到的最好的(这里是龙):
发布向导似乎不理解configSource所以我从web.config中的conectionStrings中取出了一个空元素(你也可以完全删除它,但我觉得现有但空元素最好带注释更合适).为了使它在本地工作,我添加了一个连接工厂,使工作在调试模式(本地)工作,并使发布向导找到数据库迁移.我使用了工厂,因为connectionString总是取代工厂,我需要滥用它来使项目在任何转换之前工作.还要确保传递给dbcontext构造函数的字符串(“connectionStringOrDatabaseName”)是连接字符串和数据库名称(使工厂生成的db与连接字符串db匹配).
现在它找到了数据库并且它在本地工作,但它并没有真正使用你的sharedConfig(因此不会总是在发布时工作).为了解决这个问题,我使用了web.config转换为xsd:使用configSource替换/插入空/缺少的connectionStrings元素.如果您现在尝试发布,则会遇到invalid connectionStrings element is produced的问题.
尽管如此接近我无法直接找到/找出问题的解决方案,所以我不得不采用另一种方法:I created a custom transformation aka xsd:导入时,给定一个configSource属性将父元素替换为另一个中的元素文件,我将把实现作为练习留给读者.