2013-07-30 90 views
9

我有这些类EF迁移:ALTER TABLE语句冲突与外键约束

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 TA BLE语句与FOREIGN KEY约束条件冲突 “FK_dbo.Bid_dbo.TraderUser_TraderUser_Id”。冲突发生在 数据库“LeasePlan.Development”,表“dbo.TraderUser”,列'Id'。

我不能更新数据库。任何帮助深表感谢。

+0

你想在这三个类之间完成什么样的关系? “TraderCompany”类中是否有任何属性? – SOfanatic

+0

一个出价有一个交易者用户,一个交易者用户有一个交易者公司。 TraderCompany只有几个字符串属性。 –

回答

24

不知道是不是已经太晚了,但我有同样的问题,也许这可以帮助你。

我无法从你的帖子看,但可能你的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; } 
    

    并运行迁移。

我希望这会帮助你。

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"); 
相关问题