EntityFramework (データベースが最初) と AppHarbor に問題があります。
AppHarbor によって web.config に挿入された構成文字列を使用しようとしています (Web サイトの Sequelizer 構成オプションにメタデータを追加しました)。提供されたコードを使用して値を追加しようとしています。
現在、私は非常に悪い人であり、文字列をアプリ構成プロバイダーに直接埋め込んでいます-ホスティングプロバイダーがDBを切り替えると良くないので、適切な方法でそれを行い、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 のサポート ディスカッションの 1 つから盗用) を使用して、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 を使用しているようです。