NHibernate与Count一对多

时间:2009-11-21 12:46:54

标签: c# database nhibernate fluent-nhibernate

我有实体PostTag,其中两者之间存在多对多关系(例如,每个帖子可以有一个或多个标签,每个标签都可以与任何标签相关联帖子数量。)

我希望实现的是让Tag实体拥有一个字段,提供与该标记关联的帖子数。但是,我不知道如何在没有得到Post的整个集合的情况下获得这个(我想避免)。

我正在使用Fluent NHibernate,我的实体和映射目前看起来像这样:

实体/ Post.cs

public class Post : PersistentBase
{
    public virtual string Title { get; set; }
    /* snip */

    private IList<Tag> tags = new List<Tag>();
    public virtual IEnumerable<Tag> Tags {
        get { return tags; }
    }

    public virtual void AddTag(Tag tag) {
        this.tags.Add(tag);
    }
}

映射/ PostMap.cs

public class PostMap : ClassMap<Post>
{
    public PostMap()
    {
        Id(x => x.Id).GeneratedBy.HiLo("99");
        Map(x => x.Title);
        /* snip */
        HasManyToMany(x => x.Tags);
    }
}

实体/ Tag.cs​​

public class Tag : PersistentBase
{
    public virtual string Name { get; set; }

    public static Tag Create(string name) {
        return new Tag { Name = name };
    }
}

映射/ TagMap.cs

public class TagMap : ClassMap<Tag>
{
    public TagMap ()
    {
        Id(x => x.Id).GeneratedBy.HiLo("99");
        Map(x => x.Name).Unique();
    }
}

理想情况下,我想要实现的是能够添加到Entities / Tag.cs​​中,如下所示:

public virtual int PostCount { get; set; }

然后预先填写使用该标签的帖子数量。

我该怎么做呢? (这确实可能吗?)

1 个答案:

答案 0 :(得分:3)

您需要在标记映射中定义公式。

以下是Tag实体映射在XML中的外观(我相信您可以将其转换为Fluent NHibernate方式):

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ...>
    <class name="Tag" table="Tag">
        <id name="Id" type="Int32" column="TagID">
            <generator class="hilo" />
        </id>

        ...

        <property name="Name" column="Name" type="String" not-null="true" />
        <property name="PostCount" formula="(select count(*) from PostTag pt where pt.TagID = TagID)" type="Int32" insert="false" update="false" />

        ...
    </class>    
</hibernate-mapping>

这假设您的数据库中Post和Tag之间的关联表称为PostTag。请根据您的需要更改名称。

公式在数据库级别上工作,因此是用SQL而不是HQL编写的,因此使用列名而不是属性名,正如您将在上面的XML中注意到的那样。

然后如你所描述的那样,你需要在Tag.cs​​中添加这样的aproperty:

public virtual int PostCount { get; protected set; }