asp.net mvc应用程序中层次结构树的实体设计

本文关键字:实体 层次结构 net mvc 应用程序 asp | 更新日期: 2023-09-27 18:18:03

我只是无法决定选择哪种方法来拥有具有部分不同对象类型的层次结构树。应用程序是Asp。. Net MVC和我使用实体框架代码第一。我的层次树是一个信息内容结构。树中的每个节点可以是我所实现的三种类型中的任何一种。

目前,每类型表(TPT)似乎是我最好的设计选择,但是你认为呢?我选择的设计有什么缺点吗?例如,基类是否应该有一个鉴别符字段?

为了说明,下面是我当前设计的一个伪例子。

致你的问候

    public abstract class PageObject
    {
        public int ID { get; set; }
        public int? ParentID { get; set; }
        public string Title { get; set; }
        public virtual PageObject Parent { get; set; }
        public virtual ICollection<PageObject> Children { get; set; }
    }
    [Table("LinkPage")]
    public class LinkPage : PageObject
    {
        public string Url { get; set; }
    }   
    [Table("FramedPage")]
    public class FramedPage : LinkPage
    {
        public int? MinHeight { get; set; }
        public int? MinWidth { get; set; }
    }   
    [Table("ContentPage")]
    public class ContentPage : PageObject
    {
        [DataType(DataType.Html)]
        [AllowHtml]
        public string Content { get; set; }
    }   
public class InheritanceMappingContext : DbContext
{
    public DbSet<PageObject> PageObjects { get; set; }
}

asp.net mvc应用程序中层次结构树的实体设计

例如,基类应该有一个鉴别符字段吗?

在使用这些方法时,您不必显式声明它。当使用TPH方法时,Discriminator字段将被实体框架自动添加为表字段,因为它将所有内容存储在一个表中,并且这个字段就像一个指针指向该记录所属的类。

目前,每类型表(TPT)似乎是我最好的设计选择,但是你觉得呢?

你应该意识到,这完全是一个基于观点的问题,而且它取决于你的需求。每种方法都有其优点,反之亦然。

TPH将为您提供最佳性能,因为所有数据都是由一个查询选择的,没有任何join,但它要求子类中的属性在数据库中为空。此外,TPH违反了第三种范式(性能价格)

TPT策略的主要优点是SQL模式是标准化的,但是对于复杂的类层次结构,性能可能是不可接受的,因为查询总是需要跨多个表的连接

http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx