2012-04-13 4 views
1

EntityFramework(データベース初め)とAppHarborに問題があります。EntityFramework、AppHarbor、および構成変数

AppHarborによってWeb.configに挿入された構成文字列を使用しようとしています(メタデータをWebサイトのSequelizer設定オプションに追加しました)。コードが提供されます。

現在、私は非常に悪い人で、文字列を自分のアプリケーション設定プロバイダに直接埋め込んでいます。ホスティングプロバイダがDBを切り替えるとうまくいかないので、適切な方法で値を使用したいと考えていますAppHarborはweb.config経由で提供します。

AppHarbor(パスワードやサーバーの詳細は、削除)が提供するあたり、これは文字列です:

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. 

私はそれから:

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

次のエラーが発生している、「そのまま」使用している場合次のコードを使用して、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 =真;アプリケーション= 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サーバープロバイダが一度も接続文字列を変更していないことを保証しているので、値をunhardcodingしています:) – Moo