5
我有以下的抽象類,命名爲Sector
:實體框架核心:如何從派生類型動態獲取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;}
}
我已經在我的DbContext
以下DbSet
:
public DbSet<GICSSector> GICSSectors {get; set;}
我想寫一個通用的方法來加載d ATA從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:'沒有這樣的表:部門'。
如果我檢查的類型與typeof(T)
或使用myEntity.GetType()
,我得到了相同的預期結果:MyNamespace.GICSSector
爲什麼EF核心希望將其存儲在一個名爲「部門」(基本型),而不是預期的表GICSSectors?
我該如何解決?
注意:該方法是一個通用的方法,不會用於處理僅從Sector
繼承的類。
註釋與TableAttribute的GICSSector類? – MarkB
我使用流利的API,我更新了問題 –
然後用流利的API來設置表名? (看我的回答) – MarkB