在流畅的nhibernate模型中创建一个额外的图层

时间:2013-04-29 11:39:12

标签: c# nhibernate fluent-nhibernate

在我们的数据库中,我们有一个Book数据库。这个列的列之一为int,称为“NumberOfPages

我们有一个名为“BookElements”的第二个表,它有多个字段,并与一本书BookId相关联,但每个BookElement仅与一个页面相关联,因此它还有PageNumber列。

我们可以将许多BookElements与书中的单个页面相关联。理想情况下,我希望能够以这样的方式使用流利的nhibernate模型

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

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

2 个答案:

答案 0 :(得分:0)

您可以进行以下操作:

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

表示Page-&gt; 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();

        ...

    }
}

我添加了一个新图层,以便更容易地映射字典。

答案 1 :(得分:0)

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

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