2009-11-21 89 views
0

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

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

我用流利的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(); 
    } 
} 

理想情况下想什么,我实现的是要能够加入到实体/ Tag.cs​​,类似如下:

public virtual int PostCount { get; set; } 

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

我该如何去做这件事? (这的确有可能吗?)

+0

ü不需要的tagmap类 – 2010-05-28 11:30:38

回答

3

你需要的是在你的标签映射中定义一个公式。

这里是标签实体映射应该怎么看起来像XML(我相信你可以把这一对流利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> 

这是假设在邮政和标签之间的关联表你的数据库被称为PostTag。请相应地更改名称以满足您的需求。

公式适用于数据库级别,因此使用SQL编写而不使用HQL,因此使用列名称而不是属性名称,因为您将在上面的XML中注意到这些名称。

然后像你描述你将需要在Tag.cs​​添加aproperty这样的:

public virtual int PostCount { get; protected set; } 
+0

我会怎么做,如果公式在映射类中设置,而不是一个XML文件,我不能在公式中使用关联表(PostTag),因为表名是由另一个程序集中的约定强制的? – 2010-11-26 15:33:01

+0

@Nicolas我猜你正在使用FluentNHibenrate,但这并没有改变公式是原始SQL这一事实,这意味着你将不得不硬编码在其中使用的表名。如果您意识到使用的约定,那么只需在公式中放置表格名称,因为约定会生成该表格。我不知道如何让FluentNHibernate返回生成的表名(根据使用的约定),以便您可以在公式中使用它们。 – tolism7 2010-11-27 01:21:21