2017-05-18 2 views
0

Ich hoffe, Sie können mir mit einem kleinen Problem helfen, das ich habe.Semirekursive Assoziationen mit Entity Framework Code Zuerst

Ich habe ein Entity Framework-Code Erstes Setup, wo ich die folgende Konfiguration haben:

public class UserDetails{ 
    public int Id {get;set;} 
    //... some other properties .. // 

    //This represents the approval group the user is a member of. 
    public virtual ApprovalGroup {get;set;} 

    //This represents the approval groups that the user is resposible for approving 
    public virual ICollection<ApprovalGroup> ApprovalGroups {get;set;} 
} 

public class ApprovalGroup 
{ 
    public int Id {get;set;} 
    public string Name {get;set;} 

    public virtual UserDetails Approvee {get;set;} 
    public virtual ICollection<UserDetails> Members {get;set;} 
} 

In meinem db Zusammenhang habe ich die folgenden:

modelBuilder.Entity<ApprovalGroup>().ToTable("ApprovalGroup") 
    .HasKey(t=>t.Id) 
    .HasRequired(t=>t.Approver); 

modelBuilder.Entity<ApprovalGroup>().HasMany(t=>t.Members) 
    .WithOptional().WillCascadeOnDelete(false); 

So eine Genehmigungsgruppe eine approvee haben muss Setup, könnte aber potenziell keine Mitglieder haben (besonders bei der ersten Konfiguration).

Dieser Code wird ausgeführt. Wenn ich jedoch die Datenbank überprüfe, die die Genehmigungsgruppentabelle erstellt, enthält sie eine zusätzliche Spalte namens "UserDetails_Id". Es ist als Fremdschlüssel eingerichtet, aber es ist immer Null.

Das Schema der Tabelle erstellt hat es die folgenden Spalten:

Id, Name, UserDetails_Id, Approver_Id 

Ich habe keine Ahnung, warum es die unnötige Tabelle „UserDetails_Id“ zu schaffen, und ich möchte es nicht, da es keinen Grund gibt, dafür. Ich vermute, dass etwas mit meinem Konfigurations-/Mapping-Verhalten nicht stimmt, aber ich kann nicht herausfinden, was es ist.

Bis jetzt hat Google versäumt, Licht auf das, was ich falsch mache, also wenn jemand hier helfen kann, würde es sehr geschätzt werden.

Nik

Antwort

2

Das Problem, das Sie erleben, weil der falschen/unvollständigen Beziehungen Mappings, mit EF Standard Konventionen kombiniert.

Ich würde vorschlagen, dass Sie die Beziehungen immer nur einmal pro Beziehung konfigurieren und die Überladungen verwenden, die genau dem Vorhandensein/Fehlen der Navigations- und expliziten FK-Eigenschaften entsprechen.

In diesem speziellen Fall haben Sie zwei one-to-manybidirektionale (d. H. Mit Navigationseigenschaften an beiden Enden) Beziehungen ohne explizite FK-Eigenschaften. So sollte die korrekte Konfiguration so sein:

// Entities 
modelBuilder.Entity<ApprovalGroup>() 
    .ToTable("ApprovalGroup") 
    .HasKey(t => t.Id); 

modelBuilder.Entity<UserDetails>() 
    .ToTable("UserDetails") 
    .HasKey(t => t.Id); 

// Relationships 
modelBuilder.Entity<ApprovalGroup>() 
    .HasRequired(t => t.Approver) 
    .WithMany(t => t.ApprovalGroups); 

modelBuilder.Entity<ApprovalGroup>() 
    .HasMany(t => t.Members) 
    .WithOptional(t => t.ApprovalGroup) // or whatever the name of the navigation property is (it's missing in the posted code) 
    .WillCascadeOnDelete(false); 
+1

Hallo Ivan, danke. Ich gebe das hier her und lasse Sie wissen, wie es mir geht. Dies ist mein erster richtiger tiefer Eintauch in den Code zuerst, normalerweise arbeite ich zuerst DB und mit der EDMX Akte, also ist das ein bisschen eine Verschiebung im Verstehen. Ich denke, es ist mein Verständnis davon, wie die Beziehungen zum Ausdruck gebracht werden müssen, was für mich alles ein bisschen zurück nach vorne gebracht hat. Danke noch einmal :-) – Pheonyx

Verwandte Themen