0

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

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

我们可以有许多 BookElements 与一本书中的单个页面相关。理想情况下,我希望以我们拥有的方式拥有流利的 nhibernate 模型

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

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

4

2 回答 2

0

您可以进行以下操作:

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();

        ...

    }
}

我添加了一个新层,以便更轻松地映射字典。

于 2013-04-29T12:18:19.503 回答
0

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

public BookElement[] BookElementsForPage(int pageNumber)
{
    return BookElements.Where(be => be.PageNumber == pageNumber).ToArray();
}
于 2013-04-29T16:33:50.023 回答