我有這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; }
}
當運行實體框架代碼優先,我希望能得到這樣的數據庫:
但是我得到的是上述+額外的FK到PID:
即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
無法創建約束或索引。查看以前的錯誤。
問題是爲什麼?
在添加導航屬性'E'和'P'(我希望不是你真正要使用的名稱)後,使用EF6工作正常。這是哪個版本? –