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
类是工作节点类渲染扩展,将工作节实体类渲染成HTMLToDoSomething
类用于添加、更新、删除、显示工作节点
项目运行后用浏览器访问
- http://localhost:36349/AddData 添加工作节点
- http://localhost:36349/LogData显示工作节点
- http://localhost:36349/RemoveData删除工作节点
工作节点显示效果:
![工作节点显示效果 工作节点显示效果](Images/%E6%8A%BD%E8%B1%A1%E5%AE%9E%E4%BD%93%E8%BF%90%E8%A1%8C%E7%BB%93%E6%9E%9C.png)
工作节点显示效果