继承

继承

按照约定,EF 仅会在模型中显式包括两个或更多个继承类型时设置继承。EF 不会自动扫描未在模型中包括的基类型或派生类型。

可以通过为继承层次结构中的每个类型公开 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; }
}Code language: HTML, XML (xml)

此模型映射到下面的数据库架构(请注意隐式创建的鉴别器列,该列标识每个行中存储的博客类型):

同名列映射

默认情况下,当层次结构中的两个同级实体类型具有相同的属性时,它们将映射到两个单独的列。但是,如果它们的类型相同,则可以映射到相同的数据库列:

public class MyContext : DbContext
{
    public DbSet<BlogBase> Blogs { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .Property(b => b.Url)
            .HasColumnName("Url");

        modelBuilder.Entity<RssBlog>()
            .Property(b => b.Url)
            .HasColumnName("Url");
    }
}

public abstract class BlogBase
{
    public int BlogId { get; set; }
}

public class Blog : BlogBase
{
    public string Url { get; set; }
}

public class RssBlog : BlogBase
{
    public string Url { get; set; }
}Code language: HTML, XML (xml)
Previous:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注