現在、2番目のバージョンにあるローカルデータベースがあり、3番目のバージョンに移動する必要があります。
以前の移行のコードは別のプログラマーによって生成されたため、ここで何か間違ったことをしていると思います。
私のモデルには約30のクラスがあり、モデルフォルダー内にはマッピングフォルダーがあり、その30のクラスのマッピングが含まれています。
そこで、以前のクラスと同じ方法で1つの新しいクラスを追加し、パッケージマネージャーコンソールでadd-migrationコマンドを実行します。
残念ながら、空の移行Up()およびDown()メソッドを取得します。
データベースを調べると、前の2つの移行で使用できる__migrationHistoryがあります。今すぐアプリケーションを実行すると、3番目の移行も追加されますが、新しいテーブルはUp()メソッドにないため、明らかに作成されていません。
何が間違っているのでしょうか?
以前の移行を足場とするとき、何かがおかしいと思います...私が追加した新しいCode-Firstクラスを見つけることができないようです。
これは私のコマンドです:
add-migration "1.2" -verbose -ProjectName "MyEFproject"
私は、足場が新しいクラスを探す場所を知らないと仮定しています...またはこれは、慣例により、すべてのモデルクラスがプロジェクト内にあると予想されるということですか?
追加移行の結果:
namespace MyProject.Migrations
{
using System;
using System.Data.Entity.Migrations;
public partial class _1002 : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
}
新しいモデルクラスのサンプル:
using System;
using System.Collections.Generic;
namespace MyProject.Models
{
public partial class MyTable
{
public string SomeId { get; set; }
public string SomeText { get; set; }
}
}
新しいマッピングクラスのサンプル
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity.ModelConfiguration;
namespace MyProject.Models.Mapping
{
public class MyTableMap : EntityTypeConfiguration<MyTable>
{
public MyTableMap()
{
// Primary Key
this.HasKey(t => t.SomeId);
// Properties
this.Property(t => t.SomeText)
.IsRequired()
.HasMaxLength(30);
// Table & Column Mappings
this.ToTable("MyTable", "database");
this.Property(t => t.SomeId).HasColumnName("SomeId");
this.Property(t => t.SomeText).HasColumnName("SomeText");
}
}
}
ありがとうございました、
DbContext
クラスの実装にテーブルを追加する必要があります。
public class MyDatabaseEntities : DbContext {
public virtual DbSet<MyTable> MyTable { get; set; }
}
_MigrationHistoryテーブルから最後の移行のレコードを削除することで、この問題を修正できました。このレコードは、新しいモデルオブジェクトのDbSetをDbContextクラスに追加する前に誤って作成されていました。この削除の後、正しいUp()およびDown()メソッドで新しい移行が作成されました。
既存のEF Core Data Contextを空にロールバックする間、移行に伴うApplicationDbContextModelSnapshot
を削除するまで、移行は生成されませんでした。
このクラスは自動生成され、現在の移行レベルに合わせる必要があります。
{get;を追加するのを忘れたため、この問題が発生しました。 set;}変数名の後
私の場合、datacontextプロジェクトはクラスlibプロジェクトです。スタートアッププロジェクトであるasp.net mvc 5プロジェクトとは異なります。間違って、スタートアッププロジェクトの接続文字列が別の異なるデータベースを指しています。
したがって、datacontextプロジェクトと起動プロジェクトが同じデータベースを指すようにしてください。また、質問のように次のような完全なコマンドを使用します。 -Forceも含めることができます。
add-migration "InitialMigration" -verbose -ProjectName "MyEFproject" -Force
私の場合、既存のテーブルにフィールドを追加して、空のUp
メソッドとDown
メソッドで終わる移行を行っていました。
私はこのようなものを持っていました:
public bool ExistingField { get; set; }
bool NewField { get;set; }
違いを見つけられますか...?
この間違いを犯した場合は、同じ名前で移行を再実行してください(おそらく-Force
パラメーターを完全に足場にします。
PS。あらゆる種類のEFコマンドを実行する前に、必ずプロジェクトが完全にビルドされていることを確認してください。プロジェクトがまだビルドされていない場合は、トラブルを求めています。
このパラメーター-TargetMigration:"{your-migration-name}"
を追加する前に、最新の移行でデータベースを更新する必要がありました。
おそらく、私たちが試した次のバグのあるものからデータが失われることがわかります。余裕がある場合は、-Force
を追加してください。
次に、新しいAdd-Migration
を追加しようとしましたが、空ではありませんでした。
上記で例外がスローされた場合に最後に行う必要があるのは、SQL Server Management Studioに移動して最後のAutomatic migration
を削除し、もう一度追加してみることです。
多対多ではなく一対多リレーションシップを使用して誤って2つのテーブルを関連付けたときに、空の移行が追加されていました(つまり、ナビゲーションプロパティの1つを忘れました)。多対多の関係を期待しているシードファイルがあり、その後移行中に失敗して移行が失敗しました。残念ながら、問題であることを明らかにする出力はなく、 Entity Framework Power Tools(v4がインストールされたVS2015) を使用することによってのみでした原因。
移行フォルダからすべてを削除します!その後、移行を追加します。
私にとって問題は、テーブルIDに対応するIDプロパティの名前がFeedbackIdであるということでした。 「Id」に変更すると、Up/Downは空ではなくなりました。それがどういうわけか助けてくれるならダンノ
データベースに余分な列を追加したいと思った後、この正確な問題がありました。テーブルが空でなければデータはシードされないため、すべてのテーブルと移行を削除してテーブルを再作成しました。私が移行しようとしたとき、移行には空のupメソッドとdownメソッドがありました。
これにより問題が発生するため、スナップショットファイルを削除することでこれを解決しました。そこで、すべての移行とスナップショットファイルを削除し、移行を再度追加して、データベースの更新を実行しました。新しい列でテーブルと移行が正常に更新されました。
ただし、これを行うより良い方法は、テストデータで作業している場合、downメソッドを実行し、そのようなテーブルを削除することです。明らかに、これはテーブルをドロップするのが現実の世界では悪いことです。