【问题标题】:NHibernate DTO mappingNHibernate DTO 映射
【发布时间】:2012-11-23 08:33:12
【问题描述】:
  1. 是否可以为 DTO 对象创建映射然后查询它们 而不是域?如果不解释为什么?
  2. 如果我需要几个 dto 怎么办?

  • DTos 是只读的
  • ID 由 NH 自动生成
  • 将来这些 dto 将设置映射到链接的 dto。
  • 我使用 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) 这些是只读的 DTO 和 2) 你会尝试在这里映射集合或多对一吗? 3)你的身份策略在哪里?这是为了优化返回的数据吗?

标签: nhibernate mapping


【解决方案1】:

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

您可以在返回PersonDTO 列表的Person 实体上创建查询。看看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 来获得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

【讨论】:

  • 如果我错了,请纠正我:我们不使用 dtos 映射,因为它应该在不同的应用层。
  • DTO(数据传输对象),它仅用于将信息从您的数据访问层传输到其他层,如 View 或通过 Web 服务共享。当您使用 ORM 工具时,这是一个很好的做法,因为 nHibernate 有一个代理,允许 ORm 控制您的实体。使用 DTO,您就没有这种基础设施。看这个链接:en.wikipedia.org/wiki/Data_transfer_object
  • +1 表示该 PS 注释。让我想知道是否有办法覆盖反射以将列分配给属性。
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多