2012-04-13 65 views
1

我在EntityFramework(數據庫優先)和AppHarbor中遇到了一些麻煩。EntityFramework,AppHarbor和配置變量

我試圖使用配置字符串作爲由AppHarbor插入到web.config(我已經添加元數據到網站上的Sequelizer配置選項),我試圖添加一些額外的值使用代碼提供。

目前我是一個非常糟糕的人,並將字符串直接嵌入到我的應用程序配置提供程序中 - 如果託管提供程序在我們上面切換DB,那麼效果並不好,所以我正在尋找正確的方法並使用值通過web.config提供AppHarbor供應。

這是按照由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;應用=的EntityFramework」條目是「提供連接內部字符串「而不是外部。

其他人似乎在使用提供的配置變量的AppHarbor上使用EntityFramework很好,所以我做錯了什麼?

回答

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,這就是爲什麼你收到了關於您的連接字符串的格式錯誤,內部。

我看到了一些'解決方案',但似乎沒有任何工作對我來說,包括如何在AppHarbor的網站上做到這一點的support page底部的解決方案。所提供的解決方案甚至會將應用程序發送到無限循環,因爲每次保存web.config文件時應用程序都會重新啓動,這在每個示例中都是如此。

+0

感謝您的回答 - 我按照您的建議玩弄了它,但問題在於您認爲您要修改的部分總是在您收到的字符串的末尾:)最後,我從未困擾過不硬編碼的價值,因爲我得到了保證,他們的SQL服務器提供商從來沒有切換連接字符串沒有充分的通知:) – Moo 2012-09-12 07:09:44