2010-08-06 104 views
2

我有一个基类(消息)的程序,其中许多其他类从其衍生(特别是文章和评论)。我想创建一个标准来选择RootMessage属性是Article类型的所有注释(我有一些其他类型的潜在RootMessages)。但我似乎无法找到如何在条件中添加这种约束。NHibernate标准:为属性类型添加一个约束条件

现在我的代码是这样的:

public virtual ICollection<Comment> GetCommentsByArticle(ISession session) 
    { 
     var c = session.CreateCriteria(typeof(Comment)) 
      .Add(Expression.Eq("Author", this)) 
      .AddOrder(Order.Desc("CreationDate")) 
      .SetMaxResults(20); 
     var commentList = c.List<Comment>(); 
     return commentList; 

    } 

但当然这将返回该作者的每一个评论。我想要的是这个作者的每条评论都有一个ArticleMessage类型的RootMessage。

这些是映射。

消息:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="FolkeLib" 
       namespace="Folke.Code.Domain"> 
<class name="Message" discriminator-value="0"> 
<id name="Id"> 
    <generator class="native"></generator> 
</id> 
<discriminator column="MessageType" type="Int32"/> 
<timestamp column="ModificationDate" name="ModificationDate"/> 
<property name="CreationDate" index="ArticleCreationDate"/> 
<many-to-one name="Author"/> 
<property name="Text" type="StringClob"> 
    <column name="Text" sql-type="text"/> 
</property> 
<property name="Locked"/> 
<many-to-one name="Locker" not-null="false"/> 
<many-to-one name="RootMessage" not-null="false"/> 
<many-to-one name="ParentMessage" not-null="false"/> 
<property name="Score"/> 
<many-to-one name="Site" not-null="true"/> 

文章:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="FolkeLib" 
       namespace="Folke.Code.Domain"> 
<subclass name="Article" extends="Message" discriminator-value="1"> 
<property name="Title"/> 
<set name="TagSet" lazy="true" table="MessageTag"> 
    <key column="MessageId"/> 
    <many-to-many class="Tag" column="TagId"/> 
</set> 
<set name="ImageSet" lazy="true" table="MessageImage"> 
    <key column="MessageId"/> 
    <many-to-many class="Image" column="ImageId"/> 
</set> 
<many-to-one name="Forum"/> 
</subclass> 
</hibernate-mapping> 

评论(类是几乎空了):

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       assembly="FolkeLib" 
       namespace="Folke.Code.Domain"> 
    <subclass name="Comment" extends="Message" discriminator-value="2"> 
    </subclass> 
</hibernate-mapping> 

任何帮助apprecia泰德!

回答

3

这将是比较容易回答,如果你发布你的完全映射,但是我相信沿着线的东西:

.CreateAlias("RootMessage", "rm") 
.Add(Expression.Eq("rm.class",typeof(Article))) 

是你在找什么。

+0

我按照要求将映射添加到OP。 – Astaar 2010-08-06 13:01:15

+0

NHibernate会抛出此错误消息: 无法解析属性:RootMessage.class:Folke.Code.Domain.Comment 它正在查找Comment的属性,名称为“RootMessage.class”,而不是评论的类.RootMessage属性。 – Astaar 2010-08-06 13:03:42

+0

@Whistle:我认为你可能需要创建一个别名来正确地做到这一点,我已经更新了我的答案,包括这一点。 – DanP 2010-08-06 13:15:36