NHibernate Criteria:为属性类型添加约束

时间:2010-08-06 12:42:05

标签: c# nhibernate

我有一个带有基类(Message)的程序,许多其他类从中派生出来(特别是Article和Comment)。我想创建一个标准,它将选择RootMessage属性为Article类型的所有注释(我有一些其他类型的潜在RootMessages)。但我似乎无法找到如何在标准中添加这种约束。

现在我的代码是:

 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;

    }

但当然这会返回本作者的每一条评论。我想要的是这个作者的每个评论都有一个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>

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

如果您发布了完整的映射,这将更容易回答,但我相信以下内容:

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

您正在寻找什么。