web-dev-qa-db-ja.com

Entity Framework Migrations 4.3を使用するときにデータベースに明示的に名前を付ける方法

最近、Entity Frameworkの移行を使用し始めましたが、Update-Databaseコマンドを実行したときにデータベース名が引き継がれていないことに気付きました。

私の接続文字列は次のとおりです。

<connectionStrings>
<add name="DataContext" connectionString="Server=.\SQLEXPRESS;Initial Catalog=TestDB;Trusted_Connection=Yes;" providerName="System.Data.SqlClient" />
</connectionStrings>

初めて実行するときUpdate-Databaseデータベースは正しい名前TestDBで作成されます。ただし、エンティティの1つを変更するとすぐに、スタートアッププロジェクト名を追加しない限り、更新されなくなります(マルチプロジェクトソリューションを使用しています)。

Update-Database -StartUpProjectName "TestDB.Data"

これにより、移行で常に使用される別の新しいデータベースが作成されます。 StartUpProjectNameコマンドを入力する必要はありませんが、これが生成するデータベースのデフォルト名をオーバーライドする方法はありますか?常にデータベースを作成します

TestDB.Data.DataContext

StartUpProject名を渡すときに作成されたデータベースがTestDBだけを呼び出すようにする方法はありますか、またはこれはStartUpProjectName設定の使用の制限ですか?

注として、StartUpProjectNameを指定する必要があるのは、多層プロジェクトのセットアップがあるためだと思います。移行設定ファイルは「データ」プロジェクトにあり、エンティティ/モデルは「ドメイン」プロジェクトにあります。また、以前使用していたGlobal.asax.csファイルには初期化オプションもありません。コードファーストef 4.2。そのため、私のプロジェクトでは、DataプロジェクトにDataContextがあり、そのプロジェクトにもMigrations Configurationがあります。

編集:

私はもともとこの質問を設定したので、マルチプロジェクトソリューションでデータベースに名前を付ける「正しい」方法を見つけました。以下の答えは機能しますが、理想的なソリューションではない別の領域でweb.configを複製していることを意味します。代わりに、次のようにしてDbContextに名前を付けることができます(DataContextはプロジェクトで使用した名前です):

public class DataContext : DbContext
{
    public DataContext() : base("DatabaseNameHere")
    { }

    public DbSet<Table1> Table1 { get; set; }
    public DbSet<Table2> Table2 { get; set; }

    public virtual void Commit()
    {
        base.SaveChanges();
    }
}

おかげで、

リッチ

56
Richard Reddy

update-databaseを実行するときは、移行を含むプロジェクトを指定する必要があります。そのプロジェクトに正しい接続文字列を含むapp.configファイルがあることを確認してください。

アプリケーションを複数のプロジェクトに分割する場合、アプリの実行時に使用される接続文字列は、開始されたプロジェクトの接続文字列です。移行する場合、使用される接続文字列は、移行を含むプロジェクトの接続文字列です。

同様のセットアップを行ったとき、2つの場所に接続文字列を追加する必要がありました。少し厄介ですが、それは動作します。

33
Anders Abel

パラメーターとして提供することで、app.configで管理することを回避できます。

Update-Database -Verbose 
 -ConnectionString "CONNECTIONSTRING" 
 -ConnectionProviderName "System.Data.SqlClient"
 -StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT

簡単に入力できます。無限に入力するのが好きな場合。

76
Scott Stafford

接続文字列をWebサイトプロジェクトのweb.configに保存し、DBContextファイルと移行ファイルを別のプロジェクトに保存しても、同じ接続文字列を共有できます。ただし、Dataプロジェクト(またはDBContextなどを含むプロジェクト)をPackage Manager Consoleのデフォルトプロジェクトとして設定するだけでなく、Webサイトがデフォルトのスタートアッププロジェクトに設定!!!

これはどこにも文書化されていませんが、24時間に渡って突然SQLExpress dbに適用された移行が原因であることがわからず、この結論に至りました。

23
Mike Dymond

NugetのLatest EF5で試しました。

ただし、Update-Databaseは、移行を含むプロジェクトからApp.configを読み取りません(1年前の回答のように)が、*.configを読み取りますプロジェクトを開始します。すばらしいですが、Add-MigrationUpdate-Databaseが適切な接続文字列をここで見つける方法を発見します。

  1. 最初に「DefaultConnection」接続文字列を取得しようとしています
  2. 次に、コンテキストクラス名に基づいて接続文字列名を取得しようとしています。例えば。 MyContextから派生したDbContextクラスがあるので、「MyContext」接続文字列名を使用できます。複数のdb接続がある場合に役立ちます。
  3. 上記の両方の接続文字列名が見つからない場合、-ConnectionStringNameパラメーターを指定しない限り、失敗し、「DefaultConnection」接続文字列は表示されません。パッケージマネージャコンソールのヘルプページを表示するには、get-help Update-Databaseを参照してください。

再試行やフォールバックの試行はありません。そのため、「DefaultConnection」に間違った接続文字列が含まれていると、単にエラーが表示されます。

DefaultConnectionとコンテキスト名の両方が接続文字列に存在する場合、DefaultConnectionが優先されます。

名前がより具体的であるため、#2が最初の試行になることを希望しますが、上記の手順は、dbに接続しようとするときにEF5移行が行うことです。

9
CallMeLaNN