我有实体Post
和Tag
,其中两者之间存在多对多关系(例如,每个帖子可以有一个或多个标签,每个标签都可以与任何标签相关联帖子数量。)
我希望实现的是让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; }
然后预先填写使用该标签的帖子数量。
我该怎么做呢? (这确实可能吗?)
答案 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; }