2009-11-21 58 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