0

私はこれらの3つのクラスがあります。Entity Frameworkが冗長外部キーを作成するのはなぜですか?

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; } 
} 

Entity Frameworkのコード - 最初に実行しているとき、私はデータベース内にこのような何かを得ることを期待:

enter image description here

をしかし、私は得るかがあります

enter image description here

すなわちCREATで:がpidに+余分なFK上記E 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ます:FOREIGN KEYを紹介

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 

全体を実行しているときに、このエラーが発生SCRIPTをCREATEを表 'UF'の制約 'FK_dbo.UF_dbo.P_PId'は、サイクルまたは複数のカスケード・パスを引き起こす可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。

メッセージレベル1750、レベル16、状態0、行926
制約またはインデックスを作成できませんでした。以前のエラーを参照してください。

質問はなぜですか?

+0

作業ナビゲーションプロパティ 'E'と 'P'(私はあなたが実際に使用する名前ではないことを望みます)を追加した後、EF6でOKです。これはどのバージョンですか? –

答えて

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

答えは残念ながら、質問の説明ではありませんでした:

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

    public virtual E E { get; set; } 

うん:/

余分なFKを引き起こし、余分な仮想memeber Pがありましたうん...

関連する問題