2017-02-26 67 views
0

我有這3類:爲什麼實體框架會創建冗餘外鍵?

public class P 
{ 
    [Key] 
    [Column(Order = 0)] 
    [Required] 
    public string PId { get; set; } 
} 

public class E 
{ 
    [Key] 
    [ForeignKey("P")] 
    [Column(Order = 0)] 
    [Required] 
    public string PId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [Required] 
    public string EId { get; set; 
} 

public class UF 
{ 
    [Key] 
    [Required] 
    public string Id { get; set; } 

    [ForeignKey("E")] 
    [Column(Order = 0)] 
    public string PId { get; set; } 


    [ForeignKey("E")] 
    [Column(Order = 1)] 
    public string EId { get; set; } 
} 

當運行實體框架代碼優先,我希望能得到這樣的數據庫:

enter image description here

但是我得到的是上述+額外的FK到PID:

enter image description here

即CREAT ËSCRIPT我們得到:

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_dbo.UF_dbo.E_PId_EId]') AND parent_object_id = OBJECT_ID(N'[dbo].[UF]')) 
ALTER TABLE [dbo].[UF] WITH CHECK 
    ADD CONSTRAINT [FK_dbo.UF_dbo.E_PId_EId] 
    FOREIGN KEY([PId], [EId]) REFERENCES [dbo].[E] ([PId], [EId]) 
      ON DELETE CASCADE 
GO 

但是我們也有這個額外的/冗餘FK:

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_dbo.UF_dbo.P_PId]') AND parent_object_id = OBJECT_ID(N'[dbo].[UF]')) 
ALTER TABLE [dbo].[UF] WITH CHECK 
    ADD CONSTRAINT [FK_dbo.UF_dbo.P_PId] 
    FOREIGN KEY([PId]) REFERENCES [dbo].[P] ([PId]) 
     ON DELETE CASCADE 
GO 

運行整個創建腳本時,這將導致該錯誤:

引進國外KEY表'UF'上的約束'FK_dbo.UF_dbo.P_PId'可能會導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。

消息1750,級別16,狀態0,行926
無法創建約束或索引。查看以前的錯誤。

問題是爲什麼?

+0

在添加導航屬性'E'和'P'(我希望不是你真正要使用的名稱)後,使用EF6工作正常。這是哪個版本? –

回答

0

您的ids名稱不正確。 重命名你的ID是這樣的:

pubilc class P 
{ 
    public string Id { get; set; } 
} 

public class E 
{ 
    public string PId { get; set; } 
//Entity Framework automatically recognizes it is a foreign key for P Table. 

    public string Id { get; set; } 
//don't use EId , For Primary Key just use Id. 
} 

public class UF 
{ 
    public string Id { get; set; } 

    public string PId { get; set; } 

    public string EId { get; set; } 
//For Foreign key just use: ClassName + Id 
} 
0

答案是沒有問題的描述很遺憾:/

有導致額外的FK一個額外的虛擬memeber,P:

//Shouldn't be here 
    public virtual P P { get; set; } 

    public virtual E E { get; set; } 

呀是的...