2013-07-30 136 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"); 
相關問題