数据库迁移失败导致数据库处于不一致状态迁移失败

时间:2016-02-24 17:37:01

标签: entity-framework database-migration

我有以下3个模型,这些模型在某些更改期间让我的数据库状态不一致,因为删除了失败的迁移并回滚到以前的版本,因此我无法删除对表的约束。

public class Bill
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int BillID { get; set; }

        ..........

        public int? LandlordID { get; set; }
        public virtual Landlord Landlord { get; set; }

        public int? LandlordBillID { get; set; }
        public virtual LandlordBill LandlordBill { get; set; }

        public virtual ICollection<Meter> Meters { get; set; }

        public virtual ICollection<Lift> Lifts { get; set; }

        public virtual ICollection<Refund> Refunds { get; set; }
    }

public class HalfHourlyBill
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int BillID { get; set; }

        ...........

        public int? LandlordID { get; set; }
        public virtual Landlord Landlord { get; set; }

        public int? LandlordBillID { get; set; }
        public virtual LandlordBill LandlordBill { get; set; }

    }

 public class LandlordBill
    {
        [Key]
        public int LandlordBillID { get; set; }

        .........

        public virtual ICollection<Bill> Bills { get; set; }

        public virtual ICollection<HalfHourlyBill> HalfHourlyBills { get; set; }

        public int? LandlordID { get; set; }
        public virtual Landlord Landlord { get; set; }
    }

我不确定如何恢复我的代码以使其处于与我的数据库相同的状态,因为最后的更改已经搞砸了,下面显示的迁移代码失败了:

public override void Up()
        {
            DropForeignKey("dbo.Lift", "LandlordBill_LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.Meter", "LandlordBill_LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.Refund", "LandlordBill_LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.Bill", "LandlordID", "dbo.Landlord");
            DropForeignKey("dbo.HalfHourlyBill", "LandlordID", "dbo.Landlord");
            DropForeignKey("dbo.Bill", "LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.HalfHourlyBill", "LandlordBillID", "dbo.LandlordBill");
            DropIndex("dbo.Bill", new[] { "LandlordID" });
            DropIndex("dbo.Bill", new[] { "LandlordBillID" });
            DropIndex("dbo.Lift", new[] { "LandlordBill_LandlordBillID" });
            DropIndex("dbo.Meter", new[] { "LandlordBill_LandlordBillID" });
            DropIndex("dbo.Refund", new[] { "LandlordBill_LandlordBillID" });
            DropIndex("dbo.HalfHourlyBill", new[] { "LandlordID" });
            DropIndex("dbo.HalfHourlyBill", new[] { "LandlordBillID" });
            DropPrimaryKey("dbo.LandlordBill");
            AddColumn("dbo.Bill", "Landlord_LandlordID", c => c.Guid());
            AddColumn("dbo.LandlordBill", "LandlordID", c => c.Int());
            AddColumn("dbo.HalfHourlyBill", "Landlord_LandlordID", c => c.Guid());
            AlterColumn("dbo.Bill", "LandlordID", c => c.Int());
            AlterColumn("dbo.Bill", "LandlordBillID", c => c.Int());
            AlterColumn("dbo.LandlordBill", "LandlordBillID", c => c.Int(nullable: false, identity: true));
            AlterColumn("dbo.HalfHourlyBill", "LandlordID", c => c.Int());
            AlterColumn("dbo.HalfHourlyBill", "LandlordBillID", c => c.Int());
            AddPrimaryKey("dbo.LandlordBill", "LandlordBillID");
            CreateIndex("dbo.Bill", "LandlordBillID");
            CreateIndex("dbo.Bill", "Landlord_LandlordID");
            CreateIndex("dbo.HalfHourlyBill", "LandlordBillID");
            CreateIndex("dbo.HalfHourlyBill", "Landlord_LandlordID");
            AddForeignKey("dbo.Bill", "Landlord_LandlordID", "dbo.Landlord", "LandlordID");
            AddForeignKey("dbo.HalfHourlyBill", "Landlord_LandlordID", "dbo.Landlord", "LandlordID");
            AddForeignKey("dbo.Bill", "LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            AddForeignKey("dbo.HalfHourlyBill", "LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            DropColumn("dbo.Lift", "LandlordBill_LandlordBillID");
            DropColumn("dbo.Meter", "LandlordBill_LandlordBillID");
            DropColumn("dbo.Refund", "LandlordBill_LandlordBillID");
        }

        public override void Down()
        {
            AddColumn("dbo.Refund", "LandlordBill_LandlordBillID", c => c.Guid());
            AddColumn("dbo.Meter", "LandlordBill_LandlordBillID", c => c.Guid());
            AddColumn("dbo.Lift", "LandlordBill_LandlordBillID", c => c.Guid());
            DropForeignKey("dbo.HalfHourlyBill", "LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.Bill", "LandlordBillID", "dbo.LandlordBill");
            DropForeignKey("dbo.HalfHourlyBill", "Landlord_LandlordID", "dbo.Landlord");
            DropForeignKey("dbo.Bill", "Landlord_LandlordID", "dbo.Landlord");
            DropIndex("dbo.HalfHourlyBill", new[] { "Landlord_LandlordID" });
            DropIndex("dbo.HalfHourlyBill", new[] { "LandlordBillID" });
            DropIndex("dbo.Bill", new[] { "Landlord_LandlordID" });
            DropIndex("dbo.Bill", new[] { "LandlordBillID" });
            DropPrimaryKey("dbo.LandlordBill");
            AlterColumn("dbo.HalfHourlyBill", "LandlordBillID", c => c.Guid());
            AlterColumn("dbo.HalfHourlyBill", "LandlordID", c => c.Guid());
            AlterColumn("dbo.LandlordBill", "LandlordBillID", c => c.Guid(nullable: false));
            AlterColumn("dbo.Bill", "LandlordBillID", c => c.Guid());
            AlterColumn("dbo.Bill", "LandlordID", c => c.Guid());
            DropColumn("dbo.HalfHourlyBill", "Landlord_LandlordID");
            DropColumn("dbo.LandlordBill", "LandlordID");
            DropColumn("dbo.Bill", "Landlord_LandlordID");
            AddPrimaryKey("dbo.LandlordBill", "LandlordBillID");
            CreateIndex("dbo.HalfHourlyBill", "LandlordBillID");
            CreateIndex("dbo.HalfHourlyBill", "LandlordID");
            CreateIndex("dbo.Refund", "LandlordBill_LandlordBillID");
            CreateIndex("dbo.Meter", "LandlordBill_LandlordBillID");
            CreateIndex("dbo.Lift", "LandlordBill_LandlordBillID");
            CreateIndex("dbo.Bill", "LandlordBillID");
            CreateIndex("dbo.Bill", "LandlordID");
            AddForeignKey("dbo.HalfHourlyBill", "LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            AddForeignKey("dbo.Bill", "LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            AddForeignKey("dbo.HalfHourlyBill", "LandlordID", "dbo.Landlord", "LandlordID");
            AddForeignKey("dbo.Bill", "LandlordID", "dbo.Landlord", "LandlordID");
            AddForeignKey("dbo.Refund", "LandlordBill_LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            AddForeignKey("dbo.Meter", "LandlordBill_LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
            AddForeignKey("dbo.Lift", "LandlordBill_LandlordBillID", "dbo.LandlordBill", "LandlordBillID");
        }

我在更新迁移过程中遇到的错误是约束'PK_dbo.LandlordBill'被表'HalfHourlyBill'引用,外键约束'FK_dbo.HalfHourlyBill_dbo.LandlordBill_LandlordBillID'。 无法删除约束。查看以前的错误。

1 个答案:

答案 0 :(得分:0)

enter code here我有类似的混乱。有时您可以注释掉不需要运行的命令或重新排列命令,但这就是我要做的事情:

1)为该迁移生成脚本

update-database -Script

2)那应该显示将要运行的命令。将该脚本粘贴到SQL Management Studio中并逐步执行它们以查看已应用的内容以及没有应用的内容。

3)最后一个命令将更新__MigrationHistory以反映应用的迁移。您可以运行它,或者您可以注释掉迁移Up()代码并执行update-database。

如果您相信事物是同步的,您可以注释掉Up()代码并应用它,或者您可以创建无代码迁移以同步数据库和代码模型:

add-migration resyncModels -IgnoreChanges

相关问题