實體框架核心:如何從派生類型動態獲取DbSet?

c# entity-framework entity-framework-core

我有以下抽像類,名為Sector

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

我的DbSet中有以下DbContext

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

我正在嘗試編寫一個通用方法來從CSV文件加載數據,動態創建對象,然後將對象存儲在我的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:'沒有這樣的表:Sectors'

如果我使用typeof(T)或使用myEntity.GetType()檢查類型,我會得到相同的預期結果: MyNamespace.GICSSector

為什麼EF Core想要將它存儲在名為“Sectors”(基本類型)的表中而不是在預期的GICSSectors中?

我該如何解決?

注意 :該方法是通用方法,不會用於僅處理從Sector繼承的類。

一般承認的答案

告訴EF明確使用哪個表:

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

或使用流利的api:

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


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow