EntityFramework实体继承.md

EntityFramework 实体继承

EF 可以将 .NET 类型层次结构映射到数据库。被继承的基类可以是抽象类。被继承的类必须存在DbContext实现类的DbSet属性中。

例如:

抽象基类

public abstract class WorkNode
 {
     public Guid Id { get; set; }
     public string Name { get; set; }
     public virtual WorkNode NextNode { get; set; }

     protected WorkNode() { }
 }

派生类

public class SimpleWorkNode : WorkNode
{
    public string ApprovalUser { get; set; }
}
/// <summary>
/// 并行节点
/// <para>
/// 并行节点的批准、拒绝由子节点决定,不能直接调用会签节点的批准或拒绝方法
/// </para>
/// </summary>
public class ParalleNode : WorkNode
{
    /// <summary>
    /// 子节点
    /// </summary>
    public virtual List<WorkNode> ChildNodes { get; private set; } = new List<WorkNode>();

}
/// <summary>
/// 会签节点
/// <para>
/// 会签节点的批准、拒绝由子节点决定,不能直接调用会签节点的批准或拒绝方法
/// </para>
/// </summary>
public class CountersignNode : WorkNode
{
    /// <summary>
    /// 子节点
    /// </summary>
    public virtual List<WorkNode> ChildNodes { get; private set; } = new List<WorkNode>();

}

数据库上下文

public class Repository : DbContext
{
    public Repository(DbContextOptions<Repository> options):base(options)
    {
        Console.WriteLine("初始化资源库");
    }
    protected DbSet<WorkNode> WorkNodes { get; set; }
    public DbSet<SimpleWorkNode> SimpleWorkNodes { get; set; }
    public DbSet<ParalleNode> ParalleNodes { get; set; }
    public DbSet<CountersignNode> CountersignNodes { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        base.OnConfiguring(optionsBuilder);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<WorkNode>(p =>
        {
            p.HasKey(p => p.Id);
        });

        //modelBuilder.Entity<ParalleNode>(p => {
        //    p.HasKey(p => p.Id);
        //});

        //modelBuilder.Entity<CountersignNode>(p => {
        //    p.HasKey(p => p.Id);
        //});
    }
}

在数据库上下文中,我们可以将WorkNodes属性设置成受保护的protected,以避免被开发人员吴调用

完整代码请见TestEFAbstractEntity1

  • WorkNodeExtension类是工作节点类渲染扩展,将工作节实体类渲染成HTML
  • ToDoSomething类用于添加、更新、删除、显示工作节点

项目运行后用浏览器访问

工作节点显示效果:

工作节点显示效果
工作节点显示效果

posted @ 2021-09-08 17:18  $("#阿飞")  阅读(32)  评论(0编辑  收藏  举报