添加字段并为所有现有记录分配值

Add field and assign value to all existing records

我正在尝试应用以下迁移:

public override void Up()
{
    CreateTable(
        "dbo.pltblQuoteRoHSStatus",
        c => new
            {
                QuoteRoHSStatusID = c.Int(nullable: false, identity: true),
                Status = c.String(nullable: false, maxLength: 20),
            })
        .PrimaryKey(t => t.QuoteRoHSStatusID)
        .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex");

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false));
    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID");
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true);
    DropColumn("dbo.tblQuoteGeneral", "RoHS");
}

当我 运行 update-database 时,出现以下错误:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.tblQuoteGeneral_dbo.pltblQuoteRoHSStatus_QuoteRoHSStatusID". The conflict occurred in database "WebPDC", table "dbo.pltblQuoteRoHSStatus", column 'QuoteRoHSStatusID'.

我在 tblQuoteGeneral 中已有记录。因此,我需要为所有现有记录分配一个值 (3) 到 QuoteRoHSStatusID。我已尝试对上面显示的自动生成的迁移进行以下修改:

public override void Up()
{
    CreateTable(
        "dbo.pltblQuoteRoHSStatus",
        c => new
        {
            QuoteRoHSStatusID = c.Int(nullable: false, identity: true),
            Status = c.String(nullable: false, maxLength: 20),
        })
        .PrimaryKey(t => t.QuoteRoHSStatusID)
        .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex");

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: true));
    Sql("UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3");
    AlterColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false));

    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID");
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true);
    DropColumn("dbo.tblQuoteGeneral", "RoHS");
}

我仍然遇到同样的错误。我做错了什么?

编辑:我想在一次迁移中完成上述操作。

分两次迁移完成:

首先,您添加带有(可为空的)外键的字段。将该迁移应用到数据库,然后使用脚本更新数据库中的字段。

然后添加您的第二次迁移以使该字段不可为空。

我明白我的问题是什么了。我将 post 仅供可能发现它有用的其他人使用。除了用值填充 pltblQuoteRoHSStatus table 之外,我在修改自动生成的迁移时所做的一切都是正确的。如果 pltblQuoteRoHSStatus 中没有 3ID 记录,我怎么能 运行 UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3。这就是由于外键约束导致错误的原因。

所以,这是我的工作代码:

public override void Up()
{
    CreateTable(
        "dbo.pltblQuoteRoHSStatus",
        c => new
        {
            QuoteRoHSStatusID = c.Int(nullable: false, identity: true),
            Status = c.String(nullable: false, maxLength: 20),
        })
        .PrimaryKey(t => t.QuoteRoHSStatusID)
        .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex");

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: true));
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Compliant') ");
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Noncompliant') ");
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Unknown') ");
    Sql("UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3");
    AlterColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false));

    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID");
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true);
    DropColumn("dbo.tblQuoteGeneral", "RoHS");
}