2012-02-17 6 views
46

最近エンティティフレームワークの移行を開始しましたが、Update-Databaseコマンドを実行したときにデータベース名が引き込まれていないことに気付きました。Entity Frameworkの移行を使用するときに明示的にデータベースの名前を付ける方法4.3

マイれたconnectionStringは、次のとおりです。

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

非常に最初の時間は、私がアップデート - データベース私のデータベースが正しい名前TestDBとを使用して作成されて実行されます。私は(私はマルチプロジェクトソリューションを使用しています)スタートアッププロジェクト名を追加しない限りしかし、すぐに私は私のエンティティのいずれかに変更を加えたとして、それは私のために、もはや更新されません。

Update-Database -StartUpProjectName "TestDB.Data" 

この後、移行で常に使用される別の新しいデータベースを作成します。 StartUpProjectNameコマンドを入力する必要はありませんが、これが生成するデータベースのデフォルト名を上書きする方法はありますか?それは、常にStartUpProject名を渡すときに作成したデータベースがちょうどTestDBとと呼ばれていることを確認する方法はあり

TestDB.Data.DataContext 

としてデータベースを作成するか、これはStartUpProjectNameの設定を使用しての制限ですか?

私はStartUpProjectNameを指定する必要がある理由は、私が多層プロジェクトセットアップを持っていることだと思います。 Migrations Configurationファイルは私の 'Data'プロジェクトにあり、エンティティ/モデルは私の 'Domain'プロジェクトなどにあります。私は現在、以前Global.asax.csファイルに初期化オプションを持っていません最初のコード4.2。私のプロジェクトでは、データプロジェクトにDataContextがあり、そのプロジェクトにはMigrations Configurationもあります。

編集:私、もともとセットアップ以来

私はマルチ溶液中のデータベースに名前を付けるために「正しい」方法につまずいたこの質問。以下の答えがうまくいくのは理想的な解決策ではない別の領域にweb.configを複製しているということです。代わりに、あなただけ(DataContextのは、私は私のプロジェクトで使用される単なる名前です)、このような何かを行うことによって、あなたのDbContextに名前を入れることができます。

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(); 
    } 
} 

おかげで、

リッチ

+3

編集していただきありがとうございます。私にはたくさんの助けがありました.. – Josh

+3

編集済みの回答は宝石です! – P6345uk

+0

さらに、私はこの記事を参考にしました。 http://msdn.microsoft.com/en-us/data/jj592674.aspx – billb

答えて

27

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

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

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

+0

ちょうどそれをテストし、それは働いた!提案していただきありがとうございます - 他のプロジェクトに接続文字列を配置することを決して想像しませんでした!もう一度ありがとう:) –

+0

私はWebプロジェクトで参照されている別の接続文字列ファイルに自分の接続文字列を入れます。私は他のプロジェクトからその接続文字列ファイルにリンクするので、プロジェクト間で接続文字列を複製する必要はありません。 – MrBliz

+0

パッケージマネージャコンソールがVisual Studioの現在のビルド構成を無視するようです。これは予想される動作ですか?私は主に正しい接続文字列を拾うことに興味がありますが、プロジェクト自体には他の違いがあるかもしれません。パッケージマネージャコンソールがどのexe/dllを選択するかを決定する方法 –

62

アプリ内での管理を避けることができます。config:パラメータとして提供することによって設定します。

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

あなたは無限にタイプするのが大好きです。

+0

"System.Data.SqlClient"が見つからない場合はどうしますか? –

+0

ウェブ上でこれを定義できる方法はありますか?スタートアッププロジェクトの設定?自分のビルドサーバーが自動的にマイグレーションの変更を自分のデータベースにプッシュするようにしますが、私に許可していません – amhed

+0

Web.configから接続文字列を取得しようとするならば、 '-ConnectionStringName" DefaultConnection " ' – Leigh

9

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

しかしUpdate-Databaseは(ちょうど1年前の答えのような)への移行が含まれているプロジェクトからApp.configを読んでいないが、それは唯一のプロジェクトを起動から*.configを読み込みます。それは素晴らしいですが、私はAdd-MigrationUpdate-Databaseは、ここで適切な接続文字列を検索する方法を発見:それはコンテキストクラスに基づいて接続文字列の名前を取得しようとしている次に

  • 最初の「DefaultConnectionを」接続文字列を取得しようとして

    1. 名。例えば。 DbContextから派生したMyContextクラスがあるので、 "MyContext"接続文字列名を使用できます。複数のDB接続がある場合に便利です。
    2. 上記の接続文字列名が見つからない場合は、-ConnectionStringNameパラメータを指定しないかぎり、「DefaultConnection」接続文字列は表示されず、表示されません。パッケージマネージャコンソールのヘルプページを表示するには、get-help Update-Databaseを参照してください。

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

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

    名前はより具体的ですが、上記の手順はDBに接続しようとしているときにEF5のマイグレーションが行うため、#2が最初の試行になることをお勧めします。

  • +1

    私は同じ問題を抱えていて、このポスターと同様に、移行では起動プロジェクトで接続文字列が使用され、接続文字列の名前はコンテキストと同じ名前であることがわかりました。 –

    +0

    これは本当に奇妙です。スタートアッププロジェクトの設定ファイルから常にconnectionStringを読み込みます。 DbContext名でデータベースを作成するよりも見つからない場合。 – Nps

    21

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

    これはどこにも書かれていませんが、突然SQLExpressデータベースに移行したマイグレーションがなぜこの結論に導かれたのか24時間もわかりません。

    +3

    2年後、上記の太字の部分が正確に私の狂った24時間の検索の後に必要だったものですから! –

    +0

    ありがとう!接続文字列は、スタートアッププロジェクトのapp.config/web.configから読み込まれます。 – Zantier

    +0

    デフォルトのスタートアッププロジェクトを設定するか、EFマイグレーションコマンドで-StartUpProjectNameプロパティーを設定します。 –

    関連する問題