2017-02-24 5 views
5

私はSector名付け、以下の抽象クラスを持っている:Entity Frameworkコア:派生型からDbSetを動的に取得する方法

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

そして第二のクラス、GICSSector、ウィッヒはSectorから継承:

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

私は私のDbContextDbSet次き:

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

ロードするための汎用メソッドを作成しようとしています。d CSVファイルから、ATA、その場でオブジェクトを作成し、私の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(); 
    } 

} 

私はテーブルを管理するために流暢なAPIを使用します。

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); 
} 

私が実行している場合コード私は次の例外が発生します:SQLiteエラー1: 'そのようなテーブル:セクター'

私はtypeof(T)または使用myEntity.GetType()と種類を確認した場合、私は同じ期待される結果が得られます。MyNamespace.GICSSector

EFコアはしていない予想では、「セクター」(基本型)と呼ばれるテーブルに格納したいのはなぜ

GICSSectors?

どうすれば修正できますか?

:このメソッドは、Sectorを継承するクラスのみの処理には使用されない汎用のメソッドです。

+0

はTableAttributeでGICSSectorクラスに注釈を付けますか? – MarkB

+0

私は流暢なAPIを使用して、私は質問 –

+0

を更新してから流暢なAPIを使用してテーブル名を設定しますか? (私の答えを参照してください) – MarkB

答えて

0

何台使用することを明示的にEFを教える:

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

や流暢なAPIを使用する:

modelBuilder.Entity<GICSSector>().ToTable("GICSSectors"); 
関連する問題