代码之家  ›  专栏  ›  技术社区  ›  Astaar

NHibernate条件:为属性类型添加约束

  •  2
  • Astaar  · 技术社区  · 16 年前

    我有一个带有基类(消息)的程序,许多其他类都是从中派生的(特别是文章和注释)。我想创建一个条件来选择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;
    
        }
    

    但这当然会返回作者的每一条评论。我想要的是这个作者的每个评论都有一个文章类型的根消息。

    这些是映射。

    <?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 回复  |  直到 16 年前
        1
  •  3
  •   DanP    16 年前

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

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