在流畅非hibernate模型中创建一个额外的层

本文关键字:一个 hibernate 模型 创建 | 更新日期: 2023-09-27 18:11:24

在我们的数据库中我们有一个Book数据库。其中一列和int一样名为" NumberOfPages "

我们有第二个名为"BookElements"的表,它有许多字段并与具有BookId的Book相关联,但每个BookElement仅与单个Page相关联,因此它也有PageNumber列。

在一个Book中可以有多个与单个Page相关的bookelement。理想情况下,我希望有一个流畅的nhibernate模型,这样我们就可以有

Book.Pages[0].BookElement[0].Name

因此,单个Book有许多页(基于其NumberOfPages列),然后BookElements的集合与该单个页面相关联。

在流畅非hibernate模型中创建一个额外的层

我不会尝试以这种方式建立关系模型。相反,我将把这种关系建模为标准的一对多关系,并创建一个返回页面bookelement的方法:

public BookElement[] BookElementsForPage(int pageNumber)
{
    return BookElements.Where(be => be.PageNumber == pageNumber).ToArray();
}

您可以这样做:

Dictionary<int,IList<BookElement>> BookElements { get; set; }

表示Page->BookElements

的关系

所以你可以做

if( BookElemets.Keys.Contains(pageNum) )
    BookElements[pageNum][elementNum]

添加解决方案:

class PageElements
{
    public virtual int PageNumber { get; set; }
    public virtual IList<BookElements> { get; set; }
}
class PageElementsMap : ClassMap<PageElements>
{
    public PageElementsMap()
    {
        Id(x => x.Id).GeneratedBy.Identity().Column("ID");
        Map(x => x.PageNumber);
        HasMany(x => x.BookElements)
            .KeyColumn("PageElementsID")
            .Cascade.AllDeleteOrphan();
    }
}
public virtual IDictionary<int,PageElements> PageElements { get; set; }
class MainEntityMap : ClassMap<MainEntity>
{
    public MainEntityMap()
    {
        ...
        HasMany( x => x.PageElements )
            .AsMap( x=> x.PageNumber )
            .Cascade.AllDeleteOrphan();
        ...
    }
}

我添加了一个新的图层,使它更容易映射字典