最近、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();
}
}
おかげで、
リッチ
update-database
を実行するときは、移行を含むプロジェクトを指定する必要があります。そのプロジェクトに正しい接続文字列を含むapp.config
ファイルがあることを確認してください。
アプリケーションを複数のプロジェクトに分割する場合、アプリの実行時に使用される接続文字列は、開始されたプロジェクトの接続文字列です。移行する場合、使用される接続文字列は、移行を含むプロジェクトの接続文字列です。
同様のセットアップを行ったとき、2つの場所に接続文字列を追加する必要がありました。少し厄介ですが、それは動作します。
パラメーターとして提供することで、app.configで管理することを回避できます。
Update-Database -Verbose
-ConnectionString "CONNECTIONSTRING"
-ConnectionProviderName "System.Data.SqlClient"
-StartupProjectName WEBSITE_PROJECT -ProjectName MIGRATION_PROJECT
簡単に入力できます。無限に入力するのが好きな場合。
接続文字列をWebサイトプロジェクトのweb.configに保存し、DBContextファイルと移行ファイルを別のプロジェクトに保存しても、同じ接続文字列を共有できます。ただし、Dataプロジェクト(またはDBContextなどを含むプロジェクト)をPackage Manager Consoleのデフォルトプロジェクトとして設定するだけでなく、Webサイトがデフォルトのスタートアッププロジェクトに設定!!!
これはどこにも文書化されていませんが、24時間に渡って突然SQLExpress dbに適用された移行が原因であることがわからず、この結論に至りました。
ただし、Update-Database
は、移行を含むプロジェクトからApp.config
を読み取りません(1年前の回答のように)が、*.config
を読み取りますプロジェクトを開始します。すばらしいですが、Add-Migration
とUpdate-Database
が適切な接続文字列をここで見つける方法を発見します。
MyContext
から派生したDbContext
クラスがあるので、「MyContext」接続文字列名を使用できます。複数のdb接続がある場合に役立ちます。-ConnectionStringName
パラメーターを指定しない限り、失敗し、「DefaultConnection」接続文字列は表示されません。パッケージマネージャコンソールのヘルプページを表示するには、get-help Update-Database
を参照してください。再試行やフォールバックの試行はありません。そのため、「DefaultConnection」に間違った接続文字列が含まれていると、単にエラーが表示されます。
DefaultConnectionとコンテキスト名の両方が接続文字列に存在する場合、DefaultConnectionが優先されます。
名前がより具体的であるため、#2が最初の試行になることを希望しますが、上記の手順は、dbに接続しようとするときにEF5移行が行うことです。