EntityFramework,AppHarbor和配置变量 [英] EntityFramework, AppHarbor and configuration variables

查看:262
本文介绍了EntityFramework,AppHarbor和配置变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在EntityFramework(数据库第一)和AppHarbor中遇到麻烦。



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



目前我' m是一个非常糟糕的人,并将字符串直接嵌入我的应用程序配置提供程序 - 不好,如果主机提供商切换我们的数据库,所以我正在寻找正确的方法,并通过web.config使用价值AppHarbor供应



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

 元数据= 'RES://*/MyDataEntities.csdl | RES://*/MyDataEntities.ssdl | RES://*/MyDataEntities.msl;';提供商= System.Data.SqlClient的; provider connection string ='Server = servername.sequelizer.com; Database = databasename; User ID = username; Password =< snip> ;'

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

 指定的元数据路径无效。有效的路径必须是现有的目录,扩展名为.csdl的现有文件,'.ssdl'或'.msl'或标识嵌入资源的URI。然后我使用以下代码(从AppHarbor的一个支持讨论中扣除)来附加所需的代码(

EF需要额外的东西...

  if(String.IsNullOrWhiteSpace(ProductionDatabaseConnectionString))
{
/ /获取它首先读取并缓存
var configuration = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(〜);
var connectionString = configuration.ConnectionStrings.ConnectionStrings [SQLAppHarbor001]。ConnectionString;
//为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;

生成连接字符串如下:

 元数据= 'RES://*/MyDataEntities.csdl | RES://*/MyDataEntities.ssdl | RES://*/MyDataEntities.msl;';提供商=系统。 Data.SqlClient; provider connection string ='Server = servername.sequelizer.com; Database = databasename; User ID = username; Password =< snip> ;;'MultipleActiveResultSets = True; App = EntityFramework; 

但是会产生错误:

 初始化字符串的格式不符合从索引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唱提供的配置变量很好,所以我做错了什么?

解决方案

更新:多个活动结果集)现在可以通过使用Sequelizer管理面板为注入的连接字符串启用。这是推荐的方法,因为 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 文件时,应用程序将重新启动,这是每次在示例中。 >

I'm having some trouble with EntityFramework (database first) and AppHarbor.

I'm trying to use the configuration string as inserted into the web.config by AppHarbor (I've added the metadata into the Sequelizer config option on the website), and I'm trying to add some additional values using code provided.

Currently I'm being a very bad person and embedding the string directly into my apps configuration provider - not good if the hosting provider switch DBs on us, so I'm looking to do it the proper way and use the values AppHarbor supply via the web.config.

This is the string as per provided by AppHarbor (passwords and server details removed):

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

If used "as is", that generates the following error:

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.

I then use the following code (purloined off of one of the AppHarbor support discussions) to append the required extra things EF needs...

          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;

That produces the connection string as follows:

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;

But that produces the error:

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

Index 165 being the start of "provider connection string".

The working connection string I use embedded, which currently works without issue, is:

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'

The only real differences being that the "multipleactiveresultsets=True;App=EntityFramework" entries are inside the "provider connection string" string rather than outside.

Other people seem to be using EntityFramework on AppHarbor using the supplied configuration variables fine, so what an I doing wrong?

解决方案

Update: Multiple Active Result Sets (MARS) can now be enabled for the injected connection string by using the Sequelizer admin panel. This is the recommended approach since the web.config no longer needs to be modified, which causes an AppDomain reload during startup

I came up against this today! I did the following:

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();
}

The MultipleActiveResultSets property must be inside the provider connection string, which is why you received an error regarding the format of your connection string.

I seen a few 'solutions' around but none seemed to work for me, including the solution at the bottom of a support page of how to do exactly this on AppHarbor's site. The solution provided even sends the application into an infinite loop as the application will restart every time the web.config file is saved, which is every time in the example.

这篇关于EntityFramework,AppHarbor和配置变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆