Entity framework EntityFramework、AppHarbor和配置变量

Entity framework EntityFramework、AppHarbor和配置变量,entity-framework,appharbor,Entity Framework,Appharbor,我在EntityFramework(数据库优先)和AppHarbor方面遇到了一些问题 我正在尝试使用AppHarbor插入web.config的配置字符串(我已将元数据添加到网站上的Sequelizer配置选项中),并尝试使用提供的代码添加一些附加值 目前,我是一个非常坏的人,并将字符串直接嵌入到我的应用程序配置提供程序中-如果托管提供程序在我们身上切换DBs,则不太好,因此我希望以正确的方式进行操作,并通过web.config使用AppHarbor提供的值 这是AppHarbor提供的字符串

我在EntityFramework(数据库优先)和AppHarbor方面遇到了一些问题

我正在尝试使用AppHarbor插入web.config的配置字符串(我已将元数据添加到网站上的Sequelizer配置选项中),并尝试使用提供的代码添加一些附加值

目前,我是一个非常坏的人,并将字符串直接嵌入到我的应用程序配置提供程序中-如果托管提供程序在我们身上切换DBs,则不太好,因此我希望以正确的方式进行操作,并通过web.config使用AppHarbor提供的值

这是AppHarbor提供的字符串(已删除密码和服务器详细信息):

然后,我使用以下代码(从AppHarbor支持讨论中盗取)附加EF需要的额外内容

          if (String.IsNullOrWhiteSpace(ProductionDatabaseConnectionString))
            {
                // Get it on first read and cache it
                var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
                var connectionString = configuration.ConnectionStrings.ConnectionStrings["SQLAppHarbor001"].ConnectionString;
                // Add the required extra metadata for EF4.x
                if (!connectionString.Contains("MultipleActiveResultSets=True;"))
                    connectionString += "MultipleActiveResultSets=True;";
                if (!connectionString.Contains("App=EntityFramework;"))
                    connectionString += "App=EntityFramework;";
                configuration.ConnectionStrings.ConnectionStrings["SQLAppHarbor001"].ConnectionString = connectionString;
                configuration.Save();
                ProductionDatabaseConnectionString = connectionString;
            }
            return ProductionDatabaseConnectionString;
将生成连接字符串,如下所示:

metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;'MultipleActiveResultSets=True;App=EntityFramework;
索引165是“提供者连接字符串”的开头

我使用的embedded工作连接字符串是:

metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;multipleactiveresultsets=True;App=EntityFramework'
metadata='res://*/MyDataEntities.csdl | res://*/MyDataEntities.ssdl | res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;提供程序连接字符串='Server=servername.sequelizer.com;数据库=数据库名称;用户ID=用户名;密码=;multipleactiveresultsets=True;App=EntityFramework'
唯一真正的区别在于“multipleactiveresultsets=True;App=EntityFramework”条目位于“提供者连接字符串”字符串内部,而不是外部

其他人似乎正在使用提供的配置变量在AppHarbor上使用EntityFramework,那么我做错了什么呢?

更新:现在可以使用Sequelizer管理面板为注入的连接字符串启用多个活动结果集(MARS)。这是推荐的方法,因为不再需要修改
web.config
,这会导致启动期间重新加载
AppDomain

我今天碰到了这个!我做了以下工作:

var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
var connectionString = configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString;
if (!connectionString.Contains("multipleactiveresultsets=True;"))
{
    connectionString = connectionString.TrimEnd('\'');
    connectionString = connectionString += "multipleactiveresultsets=True;\'";
    configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString = connectionString;
    configuration.Save();
}
MultipleActiveResultSets
属性必须位于
提供程序连接字符串
内,这就是您收到连接字符串格式错误的原因


我在周围看到了一些“解决方案”,但似乎没有一个对我有效,包括在AppHarbor网站底部的解决方案。提供的解决方案甚至会将应用程序发送到一个无限循环中,因为每次保存
web.config
文件时,应用程序都会重新启动,这是示例中的每次。

感谢您的回答-我尝试了您建议的方式,但问题是,您假设要修改的部分始终位于您收到的字符串的末尾:)最后,我从未费心对值进行解压缩,因为我得到了保证,他们的SQL server提供商从未在未经大量通知的情况下切换连接字符串:)
Format of the initialization string does not conform to specification starting at index 165.
metadata='res://*/MyDataEntities.csdl|res://*/MyDataEntities.ssdl|res://*/MyDataEntities.msl;';provider=System.Data.SqlClient;provider connection string='Server=servername.sequelizer.com;Database=databasename;User ID=username;Password=<snip>;multipleactiveresultsets=True;App=EntityFramework'
var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("~");
var connectionString = configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString;
if (!connectionString.Contains("multipleactiveresultsets=True;"))
{
    connectionString = connectionString.TrimEnd('\'');
    connectionString = connectionString += "multipleactiveresultsets=True;\'";
    configuration.ConnectionStrings.ConnectionStrings["ConnStringAlias"].ConnectionString = connectionString;
    configuration.Save();
}