添加字段并为所有现有记录分配值
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
中没有 3
的 ID
记录,我怎么能 运行 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");
}
我正在尝试应用以下迁移:
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
中没有 3
的 ID
记录,我怎么能 运行 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");
}