gt; 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; }
}
使用EF基于数据模型(Blog和RssBlog实体)创建数据库。生成后,两个实体合并到一个Blogs表中,如下所示:
3.2 Fluent API
如果您不想公开DbSet对于层次结构中的一个或多个实体,您可以使用Fluent API确保它们包含在模型中。如果您不依赖约定,则可以使用明确指定基类型HasBaseType
。
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<RssBlog>().HasBaseType<Blog>();
}
}
3.3 discriminator隐藏属性
上面3.1示例中,创建了discriminator辨别者隐藏属性,是基于base entity的层级。因为它是模型中的一个属性,所以可以像配置其他属性一样配置它。例如,要设置默认情况下的最大长度。
modelBuilder.Entity<Blog>()
.Property("Discriminator")
.HasMaxLength(200);
discriminator鉴别器也可以映射到实体中的实际CLR属性
class MyContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasDiscriminator<string>("BlogType");
}
}
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
//discriminator
public string BlogType { get; set; }
}
public class RssBlog : Blog
{
public string RssUrl { get; set; }
}
参考文献:
官方文档:EF索引
EF备用键
EF继承
EF继承(关系数据库)