C# 在fluent nhibernate模型中创建附加层

C# 在fluent nhibernate模型中创建附加层,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,在我们的数据库中,我们有一本书数据库。它有一列名为int,称为“NumberOfPages” 我们有第二个名为“BookElements”的表,它有许多字段,并与BookId的书关联,但每个BookElement仅与一个页面关联,因此它也有PageNumber列 我们可以在一本书中有许多与一个页面相关的BookElements。理想情况下,我希望fluent nhibernate以我们现有的方式对此进行建模 Book.Pages[0].BookElement[0].Name 因此,一本书有很多

在我们的数据库中,我们有一本
数据库。它有一列名为
int
,称为“
NumberOfPages

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

我们可以在一本书中有许多与一个页面相关的BookElements。理想情况下,我希望fluent nhibernate以我们现有的方式对此进行建模

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

因此,一本书有很多页(基于其
NumberOfPages
列),然后有一组
BookElements
,这些元素与这一页关联。

您可以做以下操作:

Dictionary<int,IList<BookElement>> BookElements { get; set; }
添加的解决方案:

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

        ...

    }
}
类页面元素
{
公共虚拟整数页码{get;set;}
公共虚拟IList{get;set;}
}
类PageElementsMap:ClassMap
{
公共页面元素映射()
{
Id(x=>x.Id).GeneratedBy.Identity()列(“Id”);
地图(x=>x.PageNumber);
有许多(x=>x.BookElements)
.KeyColumn(“PageElementsID”)
.Cascade.AllDeleteOrphan();
}
}
公共虚拟IDictionary页面元素{get;set;}
类maintentimap:ClassMap
{
公共维护地图()
{
...
HasMany(x=>x.PageElements)
.AsMap(x=>x.PageNumber)
.Cascade.AllDeleteOrphan();
...
}
}

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

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

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