2017-02-24 14 views
5

Tôi đã lớp trừu tượng sau đây, tên Sector:Lõi thực thể cốt lõi: Làm thế nào để tự động lấy DbSet từ một loại có nguồn gốc?

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

Và một lớp thứ hai, GICSSector, mà thừa hưởng từ Sector:

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

Tôi đã sau DbSet trong DbContext tôi:

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

Tôi đang cố viết một phương thức chung để tải d ata từ một tập tin CSV, tạo các đối tượng một cách nhanh chóng và sau đó lưu trữ các đối tượng trong cơ sở dữ liệu SQLLite tôi:

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

} 

tôi sử dụng các API thông thạo để quản lý các bảng:

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

Nếu tôi chạy mã Tôi nhận được ngoại lệ sau: Lỗi SQLite 1: 'không có bảng như vậy: Các ngành'.

Nếu tôi kiểm tra các loại với typeof(T) hoặc sử dụng myEntity.GetType() tôi nhận được kết quả dự kiến ​​tương tự: MyNamespace.GICSSector

Tại sao EF Lõi muốn để lưu trữ nó trong một bảng gọi là "lĩnh vực" (loại cơ bản) và không nằm trong dự kiến GICSSectors?

Làm cách nào để khắc phục sự cố?

Lưu ý: Phương pháp này là phương thức chung sẽ không được sử dụng để chỉ xử lý các lớp kế thừa từ Sector.

+0

GHi chú vào vùng lớp với TableAttribute GICSSector? – MarkB

+0

Tôi sử dụng api thông thạo, tôi đã cập nhật câu hỏi –

+0

Sau đó sử dụng API thông thạo để đặt tên bảng? (xem câu trả lời của tôi) – MarkB

Trả lời

0

Nói EF một cách rõ ràng những gì bảng để sử dụng:

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

hoặc sử dụng api thạo:

modelBuilder.Entity<GICSSector>().ToTable("GICSSectors"); 
Các vấn đề liên quan