69

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

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

<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ファイルには現在初期化オプションがありません。最初のef4.2をコーディングします。したがって、私のプロジェクトでは、データプロジェクトにDataContextがあり、そのプロジェクトにも移行構成があります。

編集:

私は最初にこの質問を設定して以来、マルチプロジェクトソリューションでデータベースに名前を付ける「正しい」方法に出くわしました。以下の答えは機能しますが、理想的なソリューションではない別の領域で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();
    }
}

ありがとう、

リッチ

4

4 に答える 4

96

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

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

無限に入力するのが好きなら、簡単にピエジー。

于 2012-05-23T17:06:43.100 に答える
33

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

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

同様のセットアップを行ったとき、接続文字列を 2 か所に追加する必要がありました。少し厄介ですが、うまくいきます。

于 2012-02-25T13:10:42.473 に答える
10

Nugetの最新のEF5で試しました。

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

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

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

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

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

于 2013-01-14T07:19:56.067 に答える