【问题标题】:Execute Stored Procedure NHibernate and return DTO/entity mapped without unique key执行存储过程 NHibernate 并返回没有唯一键映射的 DTO/实体
【发布时间】:2014-10-22 16:57:43
【问题描述】:

我有一个类和一个简单的存储过程,如下面的代码所示。问题是我想使用 NHibernate 来执行存储过程并返回一个 DTO / 实体(映射没有唯一键)。有人知道吗?请帮我。谢谢

public class Dto
{
    public virtual int DeptId { get; set; } 
    public virtual int EmpId { get; set; }  
    public virtual String Name { get; set; }
}

// mapping without id => because the stored procedure returns 
// results that do not have unique column 
public class DtoMap : ClassMapping<Dto>
{
    public DtoMap()
    {
        Property(x => x.EmpId, m => m.Column("emp_id"));  // if emp_id is PK and I use Id here,  it is ok. But in my case it is impossible
        Property(x => x.DeptId);
        Property(x => x.Name, m => m.Column("name"));
   }
}

简单代码用于使用正确配置的 NHibernate 进行查询

var list = session.GetNamedQuery("GetAll").List<Dto>();

存储过程

CREATE PROC [dbo].[GetAll]
AS 
   SELECT  
       employeeid as emp_id, deptid, name 
   FROM 
       Employee; -- the query can not change

【问题讨论】:

    标签: nhibernate stored-procedures dto


    【解决方案1】:

    在这种情况下,我不会映射Dto。我会更改您的命名查询映射:

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
      <sql-query name="GetAll">
        <return-scalar column="emp_id" type="int" />
        <return-scalar column="deptid" type="int" />
        <return-scalar column="name" type="string" />
        exec dbo.[GetAll]
      </sql-query>
    </hibernate-mapping>
    

    然后在执行查询时使用Transformer

    var list = session.GetNamedQuery("GetAll")
        .SetResultTransformer(Transformers.AliasToBean<Dto>())
        .List<Dto>();
    

    另一种选择是使用 LINQ 来投影结果:

    var list = session.GetNamedQuery("GetAll")
        .List<object[]>()
        .Select(o => new Dto 
            { 
                EmpId = (int)o[0],
                DeptId = (int)o[1], 
                Name = o[2].ToString()
            })
        .ToList();
    

    【讨论】:

    • 我想过这一点,但在您的情况下,dto 的属性必须准确命名为返回列的名称,即 emp_id、depid
    • @Martinez:我不知道是这样的——我会做一些挖掘,看看我是否可以改进答案
    • @Martinez:我更新了我的答案。我认为您没有太多选择,因为 NHibernate 需要某种唯一标识符。
    猜你喜欢
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多