1、約定情況,可以在模型中包含類型,通過 DbSet 公開繼承層次結構中每個類型
class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } //約定指定映射表到數據庫 public DbSet<RssBlog> RssBlogs { get; set; } //約定指定映射表到數據庫 } public class Blog { public int BlogId { get; set; } public string Url { get; set; } } //繼承類 public class RssBlog : Blog { public string RssUrl { get; set; } }
Blog、RssBlog 模型在數據庫表里以基類的名稱映射同一張表,對不同的數據模型類型用Discriminator字段標識,如果想更換Discriminator 字段名為其它名時可以使用Fluent API配置

數據庫列會根據數據庫模型類型需要自動設置模型中沒有類型的字段為null
2、HasBaseType顯式指定基類型
如果不依賴約定在MyContext類型配置public DbSet<Blog> Blogs { get; set; } 屬性可以使用 HasBaseType顯式指定基類型
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<RssBlog>().HasBaseType<Blog>(); base.OnModelCreating(modelBuilder); }
3、類型上繼承基類,但是希望映射數據庫時,不同的類型映射不同的表,使用 HasBaseType((Type)null) 從層次結構中刪除實體類型
public class BloggingContext : DbContext { protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<RssBlog>() .HasBaseType((Type)null) //設置沒有基類,在數據庫中就映射為不同的表 .HasKey(rb => rb.BlogId); //如果繼承類中沒有定義主鍵的話,設置基類的主鍵為繼承類的主鍵, base.OnModelCreating(modelBuilder); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } } //繼承類 public class RssBlog : Blog { public string RssUrl { get; set; } }
4、Discriminator列的配置
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .HasDiscriminator<string>("BlogType") //設置標識列的數據類型string,列名為:BlogType. 數據類型可以是string、int .HasValue<Blog>("Blog_Base") //指定數據庫插入一條數據是,不同的數據類型標識不同的值。 插入Blog類型的數據時,BlogType列值為:BlogBase .HasValue<RssBlog>("Blog_RSS");
modelBuilder.Entity<Blog>()
.HasDiscriminator<int>("BlogType") //設置BlogType為int類型
.HasValue<Blog>(0) //插入Blog類型數據時,BlogType對應的值時0
.HasValue<RssBlog>(1)
.HasValue<XmlBlog>(2);
}
