1

私はVisual Studio 2015でCode-Firstを使用してデータベースの移行を行っています。途中で、私はAdd-Migrationまで移行手順を完了しました。コード - ファーストを使用してUpdate-Databaseを実行すると、エラーが発生しました。「データベースに既に何かが存在するオブジェクトがあります。

は、Add-移行後、私は以前、このステップを逃したため、データベースの初期化子を設定するには、私のDbContextコンストラクタでコード

Database.SetInitializer(New MigrateDatabaseToLatestVersion(Of DbContext1, Migrations.Configuration)) 

のこのラインを追加しました。その後、Add-Migrationプロセスでこの部分が必要になることが懸念されるため、

"Add-Migration initial -Force" 

を実行しました。その後、私が直接

"Update-Database" 

を実行し、私はこれをした後に問題があり、エラーがこの操作は、「マスター」データベースへの接続が必要です

を出てきます。元のデータベース接続が開かれ、接続文字列から資格情報が削除されたため、「マスター」データベースへの接続を作成できません。未開封の接続を提供してください。

ADDED

私は自分のコンピュータを再起動した後、i 'は更新-データベース' を実行すると、上記のエラーはもう出てきませんでした。代わりに、別のエラーが出ました:

データベースにはすでに「something」という名前のオブジェクトがあります。

私は

Update-Database -verbose 

続い

Add-Migration Initial -IgnoreChanges 

を実行することを示唆している回答のスレッドを見て、私は両方を試してみたが、それはまだ同じエラーが表示されます。

答えて

6

問題を解決できるようにするには、EFが接続文字列を処理する方法と移行の仕組みを理解する必要があります。

EFが接続文字列を処理する方法:通常、DbContextにはパラメータなしコンストラクタがあり、これはハードコードされた接続文字列名を持つ基本クラスコンストラクタを呼び出します。プロジェクトapp.configまたはweb.configファイルには、その名前の接続文字列を定義するconnectionStringsセクションが含まれている必要があります。 これは、パッケージマネージャコンソールコマンドに明示的に接続文字列パラメータを指定しない場合、プロジェクトで使用されるデフォルトの接続文字列です。

接続文字列名MyConnectionStringNameを持ついくつかのサンプルコード:

public class MyDbContext : DbContext 
{ 
    public MyDbContext() : base("MyConnectionStringName") { ... } 
    ... 
} 

そして、あなたの.configファイル内:

<configuration> 
    ... 
    <connectionStrings> 
    <add name="MyConnectionStringName" connectionString="..." /> 
    </connectionStrings> 
</configuration> 

あなたはその方法を使用していない場合、あなたはまだ手動で右の接続を提供することができますパッケージマネージャコンソールのUpdate-Databaseへのパラメータとしての文字列を次のように入力します。

Update-Database -ConnectionString <your connection string here> -ConnectionProviderName System.Data.SqlClient 

Update-Database -ConnectionStringName MyConnectionStringName 

の移行がどのように動作するか

はまた、あなたは.configファイルで定義されているすべての接続文字列名を使用することができます移行は、コードファイルです。 Add-Migrationを実行するたびに、通常はプロジェクト内のMigrationsというフォルダにコードファイルが生成/更新されます。移行ファイルの名前は、その生成のタイムスタンプと、Add-Migrationの実行時に使用された名前とを組み合わせて構成されます。これらのファイルの内容を確認し、Add-Migrationを実行した結果を確認することができます。一度生成したコードを変更して独自のコードを追加することもできますが、今のところそれを行う必要はありません。

移行はインクリメンタルであることを意図しています。 Initialの移行から始まり、モデルコードを変更するたびに新しい移行ファイルが生成されます。データベースには、__MigrationsHistoryという名前のテーブルがあり、データベース内でどのマイグレーションが実行されたかのトレースが保持されます。

すべての移行には、方法Upと方法Downがあります。 Update-Databaseを実行するときは、暗黙的なパラメータが常に2つあります:SourceMigrationTargetMigrationです。 EFは、すべての移行のUpメソッドをSourceMigrationTargetMigration(またはデータベースをダウングレードする場合はDownメソッド)の間で段階的に適用します。 SourceMigrationTargetMigrationのパラメータを指定しない場合のデフォルトのシナリオは、SourceMigrationがデータベースに適用された最後の移行であり、TargetMigrationが保留中のものの最後であることです。 EFは、プロジェクトのデフォルトデータベースの__MigrationsHistoryテーブルを照会することによってこれらのパラメータを決定します。そのため、データベースが一貫性のない状態になっていると、移行が正しく生成されません。私はこれがあなたの問題を引き起こしていると思います。

Update-Databaseを実行するたびに、EFは__MigrationsHistoryテーブルを調べて、データベースの状態に応じて実行する必要がある移行を確認し、移行のSQLを実行した後、新しいレコードがそれぞれそのテーブルに挿入されます適用された移行。

ある時点でデータベース__MigrationsHistoryの内容が乱雑になっているようです。 Update-DatabaseAdd-Migrationsを正しく実行し、-forceパラメータを使用せずに実行した場合に発生します。

私のアドバイスあなたの問題を解決する:、Add-Migration Initialで新しいクリーンInitial移行を生成する、あなたの移行ファイルを削除し、データベースを削除し、一度だけUpdate-Databaseと、それを実行します。ゼロから開始します。その時点で、モデルコードを変更するたびにAdd Migration YourNewMigrationNameという新しいインクリメンタルマイグレーションを生成し、毎回異なる名前を使用して、Update-Databaseを1回実行して新しいマイグレーションを適用します。

注:マイグレーションの仕組みについての十分な知識がある場合は、Initialの移行を1つだけ使用し、モデルコードが変更されるたびにAdd-Migrations Initial -forceを実行して更新することもできます。 -forceパラメータを使用すると、新しい移行ファイルを生成する代わりに、既存のInitial移行ファイルを上書きすることができます。このアプローチは開発段階では便利ですが、実際には、新しいバージョンのコードをデプロイするたびにデータベースの更新を段階的に実行したい場合が多いため、通常は良い方法ではありません(おそらくデータベースを削除できません再度作成する必要があります。また、データを更新し、データベースを更新する際にデータが失われていないことを確認する必要があります)。

移行は、データベースを作成および更新するためにEFによって生成されるコードファイルです。 Update-Databaseを実行すると、移行はデータベースに対して実行されるSQLに変換されます。特定の移行に対して正確なSQLが生成されることを確認したい場合は、Update-Database -Script -SourceMigration SomeMigration -TargetMigration SomeOtherMigrationを実行してください。このコマンドはデータベースを変更せず、実際にUpdate-Databaseの実行で適用されるSQLを生成して表示するだけです。

移行の生成と実行の詳細については、hereを参照してください。

幸運を祈る!

+0

あなたの洞察に感謝します。私は自分のデータベースを削除しませんでした。私は、フォルダ全体ではなく、Migrationsフォルダから「初期」ファイルだけを削除しようとしました。その後、私は 'Add-Migration initial'と 'Update-Database'を行いました。それは今働いた! – Nurul

+0

あなたは大歓迎です! – Diana

+0

申し訳ありませんが、Code-firstに関する質問があります。あなたはそれを見てみることができます[ここ](http://stackoverflow.com/questions/42048555/is-there-any-way-i-can-just-create-a-table-in-sql-server-そして私のためにmigを更新してください)? – Nurul

関連する問題