我有以下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'。 无法删除约束。查看以前的错误。
答案 0 :(得分:0)
enter code here
我有类似的混乱。有时您可以注释掉不需要运行的命令或重新排列命令,但这就是我要做的事情:
1)为该迁移生成脚本
update-database -Script
2)那应该显示将要运行的命令。将该脚本粘贴到SQL Management Studio中并逐步执行它们以查看已应用的内容以及没有应用的内容。
3)最后一个命令将更新__MigrationHistory以反映应用的迁移。您可以运行它,或者您可以注释掉迁移Up()代码并执行update-database。
如果您相信事物是同步的,您可以注释掉Up()代码并应用它,或者您可以创建无代码迁移以同步数据库和代码模型:
add-migration resyncModels -IgnoreChanges
。