2017-02-24 12 views
5

Mam następujący klasa abstrakcyjna, nazwany Sector:Entity Framework Core: Jak dynamicznie uzyskać DbSet z typu pochodnego?

public abstract class Sector 
{ 
    public string ID {get; set;} 
    public string Name {get; set;} 
    public Sector(){} 
} 

A druga klasa, GICSSector, wich dziedziczy Sector:

public class GICSSector: Sector 
{ 
    public virtual ICollection<GICSIndustryGroup> IndustryGroups {get; set;} 
} 

Mam następujący DbSet w moim DbContext:

public DbSet<GICSSector> GICSSectors {get; set;} 

Próbuję napisać ogólny sposób ładowania d ata z pliku CSV, tworzenie obiektów w locie, a następnie przechowywać przedmioty w mojej bazy danych SQLLite:

public static void UpdateEntitiesFromCSV<T>(MyContextFactory factory, string fileName) where T : class 
{ 
    var entities = new List<T>(); 

    // ... Load entities from the CSV 
    // ... Create the objects and add them to the list 

    // Add the objects to the database 

    using (var db = factory.Create(new DbContextFactoryOptions())) 
    { 
     var set = db.Set<T>(); 

     foreach(T e in entities) 
     { 
      set.Add(e); 
     } 

     db.SaveChanges(); 
    } 

} 

używam biegle API do zarządzania tabele:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    //... 

    // GICSSector  
    modelBuilder.Entity<GICSSector>().HasKey(s => new { s.ID }); 
    modelBuilder.Entity<GICSSector>().Property(s => s.ID).HasMaxLength(2);  
    modelBuilder.Entity<GICSSector>().Property(s => s.Name).IsRequired();  
    modelBuilder.Entity<GICSSector>().Property(s => s.Name).HasMaxLength(50); 
} 

Gdybym uruchomić kod Mam następujący wyjątek: Błąd SQLite 1: "brak takiej tabeli: sektory".

Gdybym sprawdzić typ z typeof(T) lub za pomocą myEntity.GetType() uzyskać ten sam oczekiwany wynik: MyNamespace.GICSSector

Dlaczego EF Rdzeń chce przechowywać go w tabeli o nazwie „sektorów” (typu bazowego), a nie oczekiwane GICSSectors?

Jak mogę to naprawić?

Notatka: Metoda jest ogólna, która nie będzie używana do obsługi tylko klas dziedziczących po Sector.

+0

opisywanie klasę GICSSector z TableAttribute? – MarkB

+0

Używam płynnego API, zaktualizowałem pytanie –

+0

Następnie użyj płynnego API do ustawienia nazwy tabeli? (zobacz moją odpowiedź) – MarkB

Odpowiedz

0

Powiedz EF jawnie co stół do użycia:

[Table("GICSSectors")] 
public class GICSSector: Sector 
{ 
    public virtual ICollection<GICSIndustryGroup> IndustryGroups {get; set;} 
} 

lub użyć biegle API:

modelBuilder.Entity<GICSSector>().ToTable("GICSSectors");