3

私は現在、単純な POCO クラスを使用した CodeFirst アプローチで Entity Framework 4.3 を使用している ASP.NET MVC 4 プロジェクトに取り組んでいます。また、開発データベースとして SQL Server Express を使用しています。

クラスを構築して接続文字列を設定した後、プロジェクトを実行すると、問題なく SQL Server Express データベースが生成されました。

ただし、問題は、AppHarbor にデプロイしようとしていて、接続文字列に問題があることです。AppHarbor では、SQL Server を「アドオン」としてインストールし、GitHub からプッシュするプロジェクトに Sequilizer 接続文字列を挿入するエイリアスを持つように接続文字列を構成する必要があります。

これがどのように機能するかについてのドキュメントは次のとおりです。 http://support.appharbor.com/kb/add-ons/using-sequelizer

この設定はすべて正しく行われていると思いますが、アプリが接続文字列を読み取る方法に問題があるようです。

ローカル マシンで使用している開発接続文字列は次のとおりです。

<connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=aspnet-FranchiseManager-201275154247;Integrated Security=True" 
         providerName="System.Data.SqlClient" />
</connectionStrings>

AppHarbor Sequilizer 接続文字列は次のようになります。

<connectionStrings>    
    <add
      name="DefaultConnection"
      connectionString="Server=0691298f-d461-40cc-86d6-a089016ba88d.sqlserver.sequelizer.com;Database=<removed hash value>;User ID=<removed hash value>;Password=<removed hash value>;"
      providerName="System.Data.SqlClient"
    />
  </connectionStrings>

私の EF によってローカルに生成された最初の接続は、問題なく動作します。2 番目 (Sequilizer によって作成されたもの) は、アプリケーションによって読み取られていません。

ただし、SQL Server Management Studio を介して Sequilizer データベースに接続できます。 だから、それは私のアプリである必要がありますか?

AppHarbor へのデプロイのトラブルシューティングを行うために、EF によって自動生成され、ローカル コンピューターでテストされた接続文字列ではなく、接続文字列をアプリにハードコーディングしました。

これが私がしたことです:

  1. Web.config の接続文字列を、提供された AppHarbor に置き換えました。
  2. 溶液を洗浄し、
  3. ソリューションの再構築

しかし、アプリケーションを実行すると、EF によって生成された元のデータベースがまだ使用されています。これは、古い接続文字列をまだ読み取っていることを意味しているに違いありません。

接続文字列を変更するだけでは不十分なようです。接続文字列を置き換えるには、アプリケーションで他に何を変更する必要がありますか?

どんなアドバイスでも大歓迎です - ありがとう!


編集


ここに私の DbContext クラスがあります:

public class FranchiseManagerContext : DbContext
    {
        public DbSet<FranchiseSet> FranchiseSets { get; set; }
        public DbSet<Franchise> Franchises { get; set; }

    }

これは、「DefaultConnection」という名前の接続文字列でそのまま機能します。

このシナリオで EF はどのようにして DbContext と接続文字列を一致させることができますか?しかし、文字列の名前を変更すると、EF はそれを行うことができないのでしょうか?

アップデート

このSOの回答から、それが今何であるかを知っていると思います: SQL Server接続文字列の「初期カタログ」のポイントは何ですか?

初期カタログ属性は、Entity Framework が最初に開始されたときに使用される特定のデータベースを指定しているようです。

4

2 に答える 2

13

DbContext にロードさせたい接続文字列の名前を指定する必要があります。と呼ばれるものを使用することを魔法のように推測する方法はありませんDefaultConnectionname名前が指定されていない場合、から継承するクラスの名前に設定された接続文字列を探すというヒューリスティックがありますDbContext。すなわち。あなたが持っている場合:

MyAwesomeDatebase : DbContext

...その後、Entity Frameworkはこれですぐに動作します:

<add name="MyAwesomeDatebase" connectionString="blah" providerName="System.Data.SqlClient" />

...しかし、もしあなたが持っているなら:

<add name="DefaultConnection" connectionString="blah" providerName="System.Data.SqlClient" />

... Entity FrameworkMyAwesomeDatebaseDefaultConnection.

これを機能させるには、次のようにします。

public class MyAwesomeDatebase : DbContext
{
    public MyAwesomeDatebase() : base("DefaultConnection")
}

...そしてあなたは金色です。

于 2012-07-20T02:26:25.793 に答える
0

わかりました、私はついにこれを機能させたと思います。

これは AppHarbor ドキュメントのどこにも見つかりません (おそらく .net mvc に固有のものでしょうか?) が、接続文字列には DbContext クラスと同じ名前を付ける必要があります。

SOに関する他の質問を見て、これに関するいくつかのヒントを見つけました。

同じ問題に遭遇する可能性のある他の人のために:

  1. Web.config の ConnectionString の name 属性が DbContext クラスと同じ名前であることを確認してください
  2. プロジェクトをコミットしてレポにプッシュする
  3. AppHarbor のエイリアス名が接続文字列と同じ名前であることを確認してください
  4. 手順 3 の後にアプリ ハーバーに新しいビルドをデプロイします(これは、新しい接続文字列名を取得するために必要です)。

それを行った後、私のアプリは Sequilizer データベースを取得し、現在は正常に動作しています。

于 2012-07-19T21:28:54.347 に答える