我有这些课程
public class Bid : ...
{
...
[Required]
public virtual TraderUser Trader { get; set; }
}
public class TraderUser : ...
{
...
}
然后我按照以下方式更改了这些类,并添加了一个新类
public class Bid : ...
{
...
[Required]
public virtual TraderUser TraderUser { get; set; }
}
public class TraderUser : ...
{
...
public int TraderCompanyId { get; set; }
[ForeignKey("TraderCompanyId")]
public virtual TraderCompany TraderCompany { get; set; }
}
public class TraderCompany : ...
{
...
}
当我执行更新数据库时,我收到以下错误
ALTER TABLE语句与FOREIGN KEY约束冲突 “FK_dbo.Bid_dbo.TraderUser_TraderUser_Id”。冲突发生在 数据库“LeasePlan.Development”,表“dbo.TraderUser”,列'Id'。
我无法让数据库更新。非常感谢任何帮助。
答案 0 :(得分:27)
不知道是否为时已晚,但我有同样的问题,也许这可以帮到你。
我无法从您的帖子中看到,但可能您的TraderUser表中已插入了一些行。您要完成的是创建新表TraderCompany并在TraderUser中创建指向TraderCompany表的外键关系。
在一次迁移中,您尝试为已包含数据的表创建不可为空的外键关系。
您可以尝试以下方法:
第一次迁移 - 除此行外的所有内容
public int TraderCompanyId { get; set; }
应该是
public int? TraderCompanyId { get; set; }
这将允许您创建可为空的外键列。
使用TraderCompany表中的某一行更新现有数据的TraderCompanyId列。
第二次迁移 - 从
更改代码public int? TraderCompanyId { get; set; }
到
public int TraderCompanyId { get; set; }
并运行迁移。
我希望这会对你有所帮助。
答案 1 :(得分:0)
另一种方法是在迁移代码中添加一条SQL语句,以在添加外键之前插入一行。以下是我所做的一个例子:
// Countries is a new table
CreateTable(
"dbo.Countries",
c => new
{
CountryID = c.Int(nullable: false, identity: true),
Name = c.String(),
Currency = c.Int(nullable: false),
})
.PrimaryKey(t => t.CountryID);
// Heres where i insert a row into countries
Sql("INSERT INTO Countries (Name, Currency) VALUES ('United Kingdom', 0)");
// I set the default value to 1 on the ID fields
AddColumn("dbo.Brokers", "CountryID", c => c.Int(nullable: false, defaultValue: 1));
AddColumn("dbo.Products", "CountryID", c => c.Int(nullable: false, defaultValue: 1));
AddForeignKey("dbo.Brokers", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false);
AddForeignKey("dbo.Products", "CountryID", "dbo.Countries", "CountryID", cascadeDelete: false);
// Migrations then creates index's
CreateIndex("dbo.Brokers", "CountryID");
CreateIndex("dbo.Products", "CountryID");