EntityFramework,AppHarbor和配置变量

时间:2012-04-13 09:23:03

标签: entity-framework appharbor

我在使用EntityFramework(数据库优先)和AppHarbor时遇到了一些麻烦。

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

目前我是一个非常糟糕的人并将字符串直接嵌入到我的应用程序配置提供程序中 - 如果托管服务提供商在我们上面切换数据库则不好,所以我希望以正确的方式执行它并使用值AppHarbor通过web.config提供。

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

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>;'

如果“按原样”使用,则会产生以下错误:

The specified metadata path is not valid. A valid path must be either an existing directory, an existing file with extension '.csdl', '.ssdl', or '.msl', or a URI that identifies an embedded resource.

然后我使用以下代码(从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;

但这会产生错误:

Format of the initialization string does not conform to specification starting at index 165.

索引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'

唯一真正的区别是“multipleactiveresultsets = True; App = EntityFramework”条目位于“提供者连接字符串”字符串内而不是外部。

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

1 个答案:

答案 0 :(得分:2)

更新:现在可以使用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属性必须位于provider connection string内,这就是您收到有关连接字符串格式的错误的原因。

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