2016-12-09 3 views
0

Ich habe verschiedene Dinge versucht, bevor Sie hierher kommen, wie verschiedene Modellansatz, Annotation, Deklarationen in DbContext, verschiedene fließende API-Verwendungen, aber ich kann nicht sehen, was das Problem ist.Entity Framework Vererbung relationalen Tabellen

Ich habe eine YogaClass-Aufzeichnung, aber wenn ich über die Subskriptionen von einer Person iteriere, habe ich ein Abonnement, aber keine YogaClass (NULL) und ja ich .Include (Person.Subscriptions) beim Abfragen der DB, bekomme ich die Subs aber nicht die damit verbundene relationale YogaClass/WorkShop.

Kurz gesagt ich habe folgende Klassen:

Abonnement (Basisklasse)

public class Subscribtion 
{ 
    [Key] 
    public int SubscribtionID { get; set; } 

    public Person Person { get; set; } 
    public bool IsPayed { get; set; } 
} 

WorkshopSubscription (inherrits Abonnement)

public class WorkshopSubscribtion : Subscribtion 
{ 
    [Key] 
    public int WorkshopSubscribtionID { get; set; } 
    public Workshop Workshop { get; set; } 
} 

YogaClassSubscription (inherrits Abonnement)

public class YogaClassSubscribtion : Subscribtion 
{ 
    [Key] 
    public int YogaClassSubscribtionID { get; set; } 
    public YogaClass YogaClass { get; set; } 
} 

YogaClass (Basisklasse)

public class YogaClass 
{ 
    [Key] 
    public int YogaClassID { get; set; } 
    public List<Subscriptions> Subscriptions { get; set; } 
} 

WorkShop (Basisklasse)

public class WorkShop 
{ 
    [Key] 
    public int WorkShopID { get; set; } 
    public List<Subscriptions> Subscriptions { get; set; } 
} 

Jetzt, nachdem ich einige Datensätze in dem Seeder füge ich folgendes Problem habe, wenn ich meine DataBase Blick in:

Tabellenabonnement: SubscriptionID: 1, WorkShop_WorkShopID: NULL, YogaClass_YogaClassID: NULL. (Warum sind sie beide NULL?) enter image description here

Tabelle YogaClassSubscription: SubscriptionID: 1, YogaClassID: 1 enter image description here Das Gleiche gilt für Werkstatt.

Ich verstehe nicht, warum die FK von Yoga & Workshop-Abonnement ist NULL in Subscription-Tabelle.

Ich habe ein DbSet deklariert in meinem Kontext und in modelBuilder fließend API-Methode habe ich beide YogaClassSubscribtion & WorkShopSubscribtion zu ihrer eigenen Tabelle zugeordnet.

public DbSet<Subscribtion> Subscribtions { get; set; }  
protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<WorkshopSubscribtion>().ToTable("WorkshopSubscribtions"); 
    modelBuilder.Entity<YogaClassSubscribtion>().ToTable("YogaClassSubscribtions"); 
} 
+0

Warum ist es einfacher, Screenshots zu posten als vorherigen Code zu kopieren? – RandomStranger

+0

Ich finde es überhaupt nicht lesbar, wenn Code eingefügt wird, ja, wenn ich den Code einfügende Teil vollständig arbeiten würde, würde es, aber ich tue nicht, ich ersetze 'Code hier eingeben' mit dem Code aber seinem nur rendering Teilcode, so ja ich finde das ist einfacher. Wenn Sie möchten, kann ich den Code einfügen. –

+0

Wie Sie sehen, kann ich nicht den ganzen Code korrekt angezeigt bekommen und ich mache es genau so ... Es tut mir leid, aber IDK, wie das kommt. –

Antwort

1

Ich denke, Ihr Problem Subscription als die Art Ihrer generischen Listen Subscriptions aus der Verwendung der Basisklasse kommt.

public class YogaClass 
{ 
    [Key] 
    public int YogaClassID { get; set; } 
    public virtual List<YogaClassSubscription> Subscriptions { get; set; } 
} 

public class WorkShop 
{ 
    [Key] 
    public int WorkShopID { get; set; } 
    public virtual List<WorkShopSubscription> Subscriptions { get; set; } 
} 

Auf diese Weise EF weiß über die Beziehung zwischen WorkShops und WorkShopSubscriptions und zwischen YogaClasses und YogaClassSubscriptions: Sie sollten die spezifischen abgeleiteten Klassen YogaClassSubscription und WorkShopSubscription verwenden.

Eine andere Sache, die falsch scheint: Neudefinition der ID-Eigenschaft und der Key Annotationen in Ihren abgeleiteten Klassen. Sie müssen nur die ID in der Basisklasse definieren. Entfernen Sie diese Eigenschaften und ihre Anmerkungen. EF erstellt einen Fremdschlüssel mit einer Eins-zu-Eins-Beziehung zwischen Ihrer Basisklassentabelle und den Tabellen abgeleiteter Klassen.

public class WorkshopSubscription : Subscription 
{ 
    public virtual Workshop Workshop { get; set; } 
} 

public class YogaClassSubscription : Subscription 
{ 
    public virtual YogaClass YogaClass { get; set; } 
} 

Ein Rat: Ihre Navigationseigenschaften als virtuelle definieren, um EF zu ermöglichen Proxies zu verwenden, Statusänderungen in Ihren Einheiten zu verfolgen, und auch der Verwendung von Lazy Loading-zu ermöglichen.

+0

Vielen Dank Diana, ich habe die Verwendung von virtuellen Eigenschaften ziemlich viel gesehen, aber ich würde so gelehrt, so dass ich wirklich nie dazu kam, auch von der Liste zum vererbten Typ zu wechseln, arbeitete auch, aber ich bin nicht Sicher Warum, warum haben Sie geerbt, wenn Sie die Basisklasse nicht als Typ verwenden können? Jetzt habe ich nicht die YogaClass/Workshop ID in meiner Subscribbing-Tabelle, sondern eine korrekt referenzierte ID in beiden Inherrited-Classes-Tabellen. Danke nochmal ! Mit freundlichen Grüßen –

Verwandte Themen