を、私は、移行に(EF 5.0)とコード-最初使用して面白い効果を持っている(?):私はGUIDでいくつかのモデルを作成したEntity Frameworkのコード - 最初:移行は強制的に、更新データベースで失敗し不必要なアドオン移行
を主キー。 (私にとって重要なことは、現在のバージョンではデフォルト値であると思われるNEWSEQUENTIALID()
をSQL Serverが使用することです)
ある時点で私は移行を有効にしました。最初の移行にいくつかのコードを追加しましたが、これはほとんどの場合、必要に応じて.Index()
です。私は、データベースおよびコールアップデート - データベースを削除
、私は次のエラーを取得:私はAutomaticMigrationsEnabled = true
を試してみました
Unable to update database to match the current model because there are pending changes and automatic migration is disabled. Either write the pending model changes to a code-based migration or enable automatic migration. Set DbMigrationsConfiguration.AutomaticMigrationsEnabled to true to enable automatic migration. You can use the Add-Migration command to write the pending model changes to a code-based migration.
、変更または何も追加せずに働きました!
AutomaticMigrationsEnabled
が欲しくないので、私はupdate-database
と、add-migration
というデータベースを再度削除しようとしました。私は何も変えないような追加の移行を終えました(下記参照)。私はまた、これらの行を最初のマイグレーションの最後に追加しようとしましたが、これは何も変わりません。
モデルのひとつ:
[Table(Speaker.TABLENAME)]
public class Speaker : BaseModel
{
public const String TABLENAME = "Speaker";
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id { get; set; }
[Required]
[MaxLength(50, ErrorMessage = "Name must be 50 characters or less")]
public string Name { get; set; }
}
初期移行コード:以下
public partial class InitialCreate : DbMigration
{
public override void Up()
{
// [...]
CreateTable(
"dbo.Speaker",
c => new
{
Id = c.Guid(nullable: false, identity: true),
Name = c.String(nullable: false, maxLength: 50),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Name, true, false); // added manually: unique Name
// [...]
}
}
internal sealed class Configuration : DbMigrationsConfiguration<MyProject.Repositories.DBContext>
{
public Configuration()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(MyProject.Repositories.DBContext context)
{
// ...
}
}
アドインの移行により作成されたコードである:新しい何かをしていないようだ - 多分私は何かが欠けている?
public partial class UnneccessaryMigration : DbMigration
{
public override void Up()
{
// isn't this the exact same code from InitialMigrations?
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false, identity: true));
// ...
}
public override void Down()
{
//...
AlterColumn("dbo.Speaker", "Id", c => c.Guid(nullable: false));
}
}
私は不思議です:マイグレーションを混乱させるために私は何をしましたか?最初の移行を1回だけ実行するにはどうすればよいですか?
ソリューション:次の回避策は、私のためにそれをやった:ここdecribedとして 1.私は、データベースとすべてのマイグレーションを削除: https://stackoverflow.com/a/11679386/3168401 2.初期 3.私の手作りの合併有効-移行を+アドオンの移行を実行します.Index()はファイルに変更されます。 Update-Databaseは、データベースを削除するときに繰り返し実行されます。
私はこの時点で間違っているかもしれませんが、私は必要に応じてデータベースを再作成できるようにしたいと考えています。最初の移行はまったくそれをしませんか?上記の効果を偶然発見する前に、update-databaseを使ってデータベースを作成するとうまくいきました。そして、「空白の子供」移行ステップを追加するとすぐに、それも機能します。 –
データベースが存在しない場合、update databaseコマンドはデータベースを再作成し、使用可能な移行でデータベースを更新します。データベースを更新する必要がある場合は、最初に 'add-migration'を実行し、' update database'を実行して変更を追加する必要があります。 – Kaf
私は最初に「役に立たない」移行がなぜ追加されたのか不思議です。 –