0

Ich habe diese drei Klassen:Warum erstellt Entity Framework einen redundanten Fremdschlüssel?

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

Beim Ausführen von Entity Framework Code-first, ich erwarte, dass in der Datenbank, so etwas zu bekommen:

enter image description here

Aber was ich tue, ist die oben + extra FK PId:

enter image description here

dh in CREAT E SCRIPT erhalten wir:

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 

Aber wir bekommen auch diese zusätzliche redundant/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 

die in diesem Fehler führt, wenn die gesamte CREATE SCRIPT ausgeführt wird:

Einführung FOREIGN KEY Die Einschränkung 'FK_dbo.UF_dbo.P_PId' in der Tabelle 'UF' kann Zyklen oder mehrere Kaskadenpfade verursachen. Geben Sie ON DELETE NO ACTION oder ON UPDATE NO ACTION an, oder ändern Sie andere FOREIGN KEY-Einschränkungen.

Msg 1750, Ebene 16, Status 0, Zeile 926
Constraint oder Index konnte nicht erstellt werden. Siehe vorherige Fehler.

Die Frage ist warum?

+0

Works OK mit EF6 nach dem Hinzufügen der Navigationseigenschaften 'E' und' P' (die ich hoffe, sind keine Namen, die Sie wirklich verwenden werden). Welche Version ist das? –

Antwort

0

Ihr ID-Name ist falsch. benennen Sie Ihre ID wie folgt aus:

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

Die Antwort war in der Frage Beschreibung leider nicht:/

Es gab eine zusätzliche virtuelle memeber P, die die zusätzliche FK verursacht:

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

    public virtual E E { get; set; } 

Ja Ja ...

Verwandte Themen