2017-06-23 5 views
1

Ich fange an, EFCore in einer UWP-App mit SQLite zu verwenden. Ich habe die Klassen deklariert, die in der Datenbank gespeichert werden sollen. Ich habe dann verschiedene DbSets und die OnConfiguring Überschreibung erklärt:EFCore/UWP fehlen einige Tabellen mit Add-Migration

public class DatabaseContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 
    public DbSet<Relationship> Relationships { get; set; } 
    public DbSet<SourceDescription> SourceDescriptions { get; set; } 
    public DbSet<Agent> Agents { get; set; } 
    public DbSet<Event> Events { get; set; } 
    public DbSet<Document> Documents { get; set; } 
    public DbSet<PlaceDescription> PlaceDescriptions { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlite("Filename=Testing.db"); 
    } 
} 

im Paket-Manager-Konsole habe ich dann gehen:

Add-Migration 2017-06-23 

und es schafft, den Code dann die Datenbank aufzubauen. In diesem Code fehlen jedoch einige der Top-Level-Tabellen. Einige von ihnen sind dort, aber einige nicht und ich kann nicht sehen, was das verursacht. Es werden keine Fehler generiert und ich kann kein Muster finden, um festzustellen, warum die fehlenden Tabellen fehlen.

Weitere Informationen:

  • Es gibt 29 Klassen definiert in meinem Code. Der Migrationscode erstellt 24 Tabellen.

  • Von den 5 "fehlenden" Klassen, 4 von ihnen sind von Subject abgeleitet, die wiederum von Conclusion abgeleitet ist. Die fünfte ist die Abschlussklasse. Da der Migrationscode die Eigenschaften von jeder der abgeleiteten Klassen "zusammenführt", bin ich nicht überrascht, dass die Schlussfolgerung-Klasse keine eigene Tabelle hat, da sie nicht direkt als Klasse verwendet wird.

  • Mit Ausnahme der Schlussfolgerung-Klasse werden die anderen 4 Klassen nur in den DbSet-Eigenschaften referenziert (im Gegensatz zu Eigenschaften in anderen Klassen). Wie oben erwähnt, ist die Document-Klasse von einer anderen Klasse abgeleitet, so dass es sich nicht um abgeleitete Klassen handelt, die der gemeinsame Faktor ist.

  • Es ist nicht so, dass einige der Klassen Teilklassen sind.

  • Ich kann nichts über die Eigenschaften in den Klassen finden, die ein gemeinsamer Faktor ist. Zum Beispiel hat die Person-Klasse einige Male List, aber auch die Agent-Klasse und erscheint im Migrationscode.

Irgendwelche Vorschläge, wonach ich suchen kann oder ob dies ein bekanntes Problem ist?

+0

Erben einige der Klassen andere? –

+0

@IvanStoev Ja, aber das ist nicht die Antwort, fürchte ich. Ich habe einige weitere Informationen hinzugefügt, um zu zeigen, dass einige der abgeleiteten Klassen im Migrationscode enthalten sind. –

+1

Der Punkt ist, wenn eine Basisklasse über 'DbSet' verfügbar gemacht wird oder von der Navigationseigenschaft einer Entität referenziert wird oder als generisches Argument von' modelBuilder.Entity' verwendet wird (im Gegensatz zur einfachen Implementationsvererbung), wird EF Betrachten Sie es als eine Entität und verwenden Sie die TPH-Strategie (dh erstellen Sie eine Tabelle mit Diskriminator). Zum Beispiel könnten die 4 fehlenden Klassen in einer "Betreff" -Tabelle konsolidiert worden sein.Überprüfen Sie die Migration für die Tabelle mit der Diskriminatorspalte. –

Antwort

1

Um zu verdeutlichen, lautet die Antwort von Ivan, dass EF Core die vier Klassen erkennt, die von der Subject-Klasse abgeleitet sind, und eine Tabelle für die Subject-Klasse erstellt, die alle Eigenschaften für diese abgeleiteten Klassen enthält. Es wird dann eine Discriminator-Spalte zur Subject-Klasse hinzugefügt, die angibt, für welche abgeleitete Klasse dies gilt.

http://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy ist ein guter Artikel zur Erklärung.

Ein interessanter Ansatz zum Entwerfen von Datenbanktabellen, die ich vorher nicht kannte. Ich lebe und lerne :)

Verwandte Themen