然而另一个流利的Nhibernate映射问题

时间:2011-09-14 23:09:05

标签: nhibernate fluent-nhibernate mapping

我很难弄清楚如何处理映射情况:

我有不同的对象(让我们说新闻和帖子)可以有多个评论。我最终得到以下架构:

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar)
NEWS_COMMENT : NEWS_ID(int), COMMENT_ID(int)
POST_COMMENT : POST_ID(int), COMMENT_ID(int)

我希望我的News和Post对象具有IList / ICollection注释属性。

我该如何去映射这个以便我可以直接在帖子或新闻实例中与我的评论进行互动?

注意:我目前已经创建了NewsMap,PostMap,CommentMap,NewsCommentMap,PostCommentMap,后两个有复合词......但它不能正常工作......

感谢。

2 个答案:

答案 0 :(得分:1)

无需为NEWS_COMMENTPOST_COMMENT创建映射。这些多对多关系,可以在关系的每一侧(NewsMapPostMap)进行映​​射。请参阅以下示例:

public class NewsMap: ClassMap<News>
{
  public NewsMap()
  {
    Table("NEWS");
    Id(x => x.Id);

    HasManyToMany(x => x.Comments)
     .Table("NEWS_COMMENT")
     .ParentKeyColumn("NEWS_ID")
     .ChildKeyColumn("COMMENT_ID")
     .Cascade.All()
     .Inverse();
  }
}

答案 1 :(得分:0)

选项1:只有一个评论类

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar), NEWS_ID(int), POST_ID(int)

映射

public NewsMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("NEWS_ID")
        .Cascade.AllDeleteOrphan();
}

public PostMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("POST_ID")
        .Cascade.AllDeleteOrphan();
}

或有子类

NEWS : ID(int), CONTENT(varchar)
POST : ID(int), SUBJECT(varchar)
COMMENT : ID(int), TEXT(varchar)
NEWS_COMMENT : NEWS_ID(int), COMMENT_ID(int)
POST_COMMENT : POST_ID(int), COMMENT_ID(int)

class Post
{
    public virtual ICollection<PostComment> { get; set; }
}

public PostMap()
{
    HasMany(x => x.Comments)
        .KeyColumn("POST_ID")
        .Cascade.AllDeleteOrphan();
}

public PostCommentMap : SubClassMap<PostComment>
{
    public PostCommentMap()
    {
        Table("POST_COMMENT");
        KeyColumn("COMMENT_ID");
    }
}