1

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 を使用しているようです。

4

1 に答える 1

1

更新: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のサイトでこれを正確に行う方法のサポートページの下部にある解決策を含め、どれも私にとってはうまくいかなかったようです。web.config提供されたソリューションは、ファイルが保存されるたびに、つまり例では毎回アプリケーションが再起動するため、アプリケーションを無限ループに送ります。

于 2012-09-11T21:00:39.567 に答える