0

Nun, nach einem Morgen des Schlagens mein Kopf gegen die Wand, werfe ich dies da draußen.EF6 Code erste zusammengesetzte primäre und fremde Schlüssel: Fremdschlüssel muss zugeordnet werden

Ich habe eine DB-Tabelle (Tabelle1) mit einer zusammengesetzten PK (Column1, Column2, Column3). (Spalte1, Spalte3) ist auch ein FK zu einer anderen Tabelle (Tabelle2).

Versuch-Code Ersten EF6 zu verwenden (6.1.3) und hier sind die Modelle:

[Table("DB.Table1")] 
public partial class Object1 
{ 
    [Key] 
    [Column(Order=0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Column1 { get; set; } 

    [Key] 
    [Column(Order=1)] 
    public byte Column2 { get; set; } 

    [Key] 
    [Column(Order=2)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Column3 { get; set; } 

    public virtual Object2 SecondObject { get; set; } 
} 

[Table("DB.Table2")] 
public partial class Object2 
{ 
    public Object2() 
    { 
     FirstObjects = new HashSet<Object1>(); 
    } 

    [Key] 
    [Column(Order=0)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Column1 { get; set; } 

    [Key] 
    [Column(Order=1)] 
    [DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int Column3 { get; set; } 

    public virtual ICollection<Object1> FirstObjects { get; set; } 
} 

Mein Modelbuilder (fliessend API):

modelBuilder.Entity<Object1>() 
    .HasRequired(o => o.SecondObject) 
    .WithMany() 
    .HasForeignKey(o => new { o.Column1, o.Column3 }); 

Vielleicht bin ich etwas fehle mit dem ICollection in Objekt2?

Ich erhalte eine Fehlermeldung, die besagt "Foreign-Key-Einschränkung aus Tabelle Object1 (Column1, Column3) zu Tabelle Object2 (Column1, Column3) :: Unzureichende Zuordnung: Fremdschlüssel muss einigen AssociationSet oder EntitySets zugeordnet werden Fremdschlüsselvereinigung auf der konzeptionellen Seite. "

Ich habe versucht:

modelBuilder.Entity<Object1>() 
    .HasRequired(o => o.SecondObject) 
    .WithMany(o => o.FirstObjects) 
    .HasForeignKey(o => new { o.Column1, o.Column3 }); 

ohne Erfolg. Ich habe einen "FirstObjects deklariert auf Objekt2 wurde mit widersprüchlichen Fremdschlüsseln konfiguriert" -Fehler.

Dies wurde CodeFirst aus einer vorhandenen Datenbank generiert.

Antwort

0

Kurz, Ihr erstes fließend configutaion

modelBuilder.Entity<Object1>() 
    .HasRequired(o => o.SecondObject) 
    .WithMany() 
    .HasForeignKey(o => new { o.Column1, o.Column3 }); 

zusammen mit der Object2.FirstObjects Navigationseigenschaft schafft zwei zusätzliche Spalten und zwei Fremdschlüssel, die nicht korrekt ist und Probleme verursachen.

Die richtige Konfiguration für ein solches Modell ist das zweite:

modelBuilder.Entity<Object1>() 
    .HasRequired(o => o.SecondObject) 
    .WithMany(o => o.FirstObjects) 
    .HasForeignKey(o => new { o.Column1, o.Column3 }); 

Aber stellen Sie sicher, dass Sie mit frischen oder ohne Datenbank gestartet werden, da die automatische Migration nicht richtig, dass der Wandel umgehen kann. Wenn Sie Ihre Datenbank behalten möchten, geben Sie einen beliebigen Object1 oder Object2 Konfigurationscode sowie die entsprechenden DbSet s aus. Aktualisieren Sie dann die Datenbank. (Stellen Sie sicher, dass Table1 und Table2 gelöscht werden). Dann entfernen Sie den Code Object1 und Object2 (mit der zweiten Konfiguration!) Und aktualisieren Sie die Datenbank. Jetzt sollte alles in Ordnung sein. Ich habe es in einer sauberen Umgebung gemacht und es hat funktioniert.

+0

Ivan, schätzen die Antwort. Wenn ich das versuchte, bekomme ich ein FirstObjects deklariert auf Object2 wurde konfiguriert mit widersprüchlichen Fremdschlüsseln "Fehler. – John

+0

Nun, wie ich schon sagte, ich habe kopiert/eingefügt Ihren Code in meinem EF6.1.3 Test db Kontext und es funktioniert einfach. Die einzige Änderung, die ich gemacht habe, war "DB" aus Tabellennamen zu entfernen. SqlServer db BTW, weiß nicht, was ist Ihre db. Es gibt nichts mehr, was ich tun kann, viel Glück. –

+0

Ivan, ich fand das Problem mit warum Die angegebene WithMany funktionierte nicht. Object1 FK wurde als (Column1, Column3) gesetzt. - Object2 FK wurde gesetzt (Column3, Column1). Vorrang ist wichtig :) Danke! – John

Verwandte Themen