問題を解決できるようにするには、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つあります:SourceMigration
とTargetMigration
です。 EFは、すべての移行のUp
メソッドをSourceMigration
とTargetMigration
(またはデータベースをダウングレードする場合はDown
メソッド)の間で段階的に適用します。 SourceMigration
とTargetMigration
のパラメータを指定しない場合のデフォルトのシナリオは、SourceMigration
がデータベースに適用された最後の移行であり、TargetMigration
が保留中のものの最後であることです。 EFは、プロジェクトのデフォルトデータベースの__MigrationsHistory
テーブルを照会することによってこれらのパラメータを決定します。そのため、データベースが一貫性のない状態になっていると、移行が正しく生成されません。私はこれがあなたの問題を引き起こしていると思います。
Update-Database
を実行するたびに、EFは__MigrationsHistory
テーブルを調べて、データベースの状態に応じて実行する必要がある移行を確認し、移行のSQLを実行した後、新しいレコードがそれぞれそのテーブルに挿入されます適用された移行。
ある時点でデータベース__MigrationsHistory
の内容が乱雑になっているようです。 Update-Database
とAdd-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を参照してください。
幸運を祈る!
あなたの洞察に感謝します。私は自分のデータベースを削除しませんでした。私は、フォルダ全体ではなく、Migrationsフォルダから「初期」ファイルだけを削除しようとしました。その後、私は 'Add-Migration initial'と 'Update-Database'を行いました。それは今働いた! – Nurul
あなたは大歓迎です! – Diana
申し訳ありませんが、Code-firstに関する質問があります。あなたはそれを見てみることができます[ここ](http://stackoverflow.com/questions/42048555/is-there-any-way-i-can-just-create-a-table-in-sql-server-そして私のためにmigを更新してください)? – Nurul