流畅的NHibernate将多行分组到集合属性

时间:2010-08-10 08:12:52

标签: c# fluent-nhibernate

我有像

这样的课程
public class Content
{
    // ...
    public virtual IList<Detail> { get; set; }
}
public class Detail
{
    // ...
    public virtual Content Content { get; set; }
    public virtual string Name { get; set; }
}
public class TagDetail : Detail
{
    public virtual Tag Value { get; set; }
}
public class TagCollectionDetail : Detail
{
    public virtual IList<Tag> Value{ get; set; }
}

我想将这些细节映射到表格

Details -table
contentId    name    type            tagId
1            Tag     Tag             2
2            Tags    TagCollection   1
2            Tags    TagCollection   3
2            Tags    TagCollection   6

是否可以使用Fluent NHibernate(以及如何)将多行分组到一个对象? 我知道重复信息(Detail.Name,Detail.Type)是一件坏事,但搜索会更容易。

或者我是否必须将其映射到两个表中?

Details -table
contentId    name    type            tagId
1            Tag     Tag             2
2            Tags    TagCollection

DetailsCollection -table
detailId    tagId
2           1
2           3
2           6

1 个答案:

答案 0 :(得分:0)

我会按如下方式对此进行建模:

Detail (table)
    - DetailId (col), PK
    - ContentId (col), FK to Content table
    - Name (col)

Tag (table)
    - TagId, PK
    - Other tag columns

TagDetail (table), only 1 row per Detail
    - TagDetailId (col), PK
    - DetailId (col), FK to Detail table
    - TagId, FK to Tag table

TagCollectionDetail (table), there would be many rows of this per Detail
    - TagCollectionDetailId, PK
    - DetailId (col), FK to Detail table
    - TagId, FK to Tag table

PK =主键,FK =外键。我会将这些列设置为数字/整数类型,它会自动递增。对于没有主键的表,NHibernate不能很好地工作(或者根本不可能)。

更多地考虑这个问题,我不明白为什么你有TagDetail和TagCollectionDetail。 TagDetail是TagCollectionDetail的特例,其中只有1个标记。我想你可以摆脱TagDetail。