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