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