NHibernate DTO映射

时间:2012-12-05 13:39:11

标签: nhibernate mapping

  1. 可以为DTO对象创建Mappings然后查询它们 而不是域名?如果不解释原因?
  2. 如果我需要几个dtos怎么办?

    • DTos只读
    • ID由NH自动生成
    • 将来这些dtos将设置映射到链接的dtos。
    • 我使用DTO来减少查询大小

      <class name="Person" table="`APP_Person`">  
          <property name="FirstName" type="string" length="512" />
          <property name="Age" type="int" /> 
          <property name="SocialNumber" type="int" />
          <property name="PassportId" type="int" />
          <property name="Salary" type="int" />
      </class>
      
      <class  name="PersonDTO" table="`APP_Person`">  
          <property name="FirstName" type="string" length="512" />
          <property name="Age" type="int" />
      </class>
      

1 个答案:

答案 0 :(得分:9)

您无需映射/保留DTO对象。只读数据并发送到应用程序的其他层(Web服务,视图等)是正常的。

您可以在返回Person列表的PersonDTO实体上创建查询。看看SetResultTransformer方法。尝试这样的事情:

var query = session.CreateQuery("select p.FirstName, p.Age from Person p order by p.FirstName")
                   .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(PersonDTO)))
                   .List<PersonDTO>();

你的DTO:

public class PersonDTO 
{
   public string FirstName { get; set; }
   public int Age { get; set; }
}

hql查询中的列的结果应与您的DTO属性具有相同的名称,NHibernate在构造DTO并对对象进行水合时进行正确的反射。

LINQ的

您还可以使用linq来获得DTO(或DTO列表)。样本:

var query = Session.Query<Person>().OrderBy(x => x.FirstName)
                   .Select(x = new PersonDTO() { FirstName = x.FirstName, Age = x.Age })
                   .ToList();

查看此文章:http://gustavoringel.blogspot.com.br/2009/02/creating-dto-in-nhibernate-hql-using.html