在Nhibernate中填充entites

时间:2012-04-12 07:05:44

标签: nhibernate

任何人都可以帮我一些想法吗?以下是我的问题。 假设我有一个名为A的实体,其中包含字段A1,A2,A3和A4,并且我还有3个存储过程,它们仅从表A返回数据。

(注意:表A只有4列A1,A2,A3,A4)。

返回A1,A2的第一个存储过程 第二个存储过程返回A1,A2,A3 第三个存储过程单独返回A1。

对于上面的场景,我是否需要创建三个不同的映射,或者是否有任何解决方法?如何使用单个实体A处理此场景并使用较少的更改代码.......

我的情景:

public IList<Userdatasw> Find(string userName)
        {
            var s = ServiceLocator.Resolve<IeGoatSessionFactory>().OpenSession();

            // Executing the stored procedure 
            IList userList1 = s.CreateSQLQuery("exec dbo.IFSEntry @UserName=:UserName")
                .AddScalar("Password", NHibernateUtil.String)
                .AddScalar("UserLevel", NHibernateUtil.Int32)
                .AddScalar("UserName", NHibernateUtil.String)
                .AddScalar("EmployeeId", NHibernateUtil.String)
                .AddScalar("SenAccntManager", NHibernateUtil.String)
                .AddScalar("updaterequired", NHibernateUtil.String)
                .SetParameter("UserName", userName).List();

            // Trying to cast anonymous type to Userdatasw
            IList<Userdatasw> userdatasw1 = userList1.OfType<Userdatasw>().ToList();
            return userdatasw1;

        }

在上面的代码中,返回类型是Ilist但我需要将其转换为Userdatasw,代码更改更少。 我已经看到很多链接来解释Nhiberante中“存储过程中的填充”,但我有20个字段的实体,而上面的SP只返回6个值。

因此,对于每个返回相同类型的SP,我们需要创建单独的映射?

任何想法都将受到赞赏。

谢谢, 文卡塔斯。 Ĵ

1 个答案:

答案 0 :(得分:0)

大家好我有解决方案。如果我们使用SetResultTransformer,它很简单。

    public IList<Userdatasw> Find(string userName)
    {
        var s = ServiceLocator.Resolve<IeGoatSessionFactory>().OpenSession();

        IQuery query = s.CreateSQLQuery("exec dbo.IFSEntry @UserName=:UserName")
                          .AddScalar("Password", NHibernateUtil.String)
                          .AddScalar("UserLevel", NHibernateUtil.Int32)
                          .AddScalar("UserName", NHibernateUtil.String)
                          .AddScalar("EmployeeId", NHibernateUtil.String)
                          .AddScalar("SenAccntManager", NHibernateUtil.String)
                          .AddScalar("updaterequired", NHibernateUtil.String)
                          .SetResultTransformer(Transformers.AliasToBean(typeof(Userdatasw)))
                          .SetParameter("UserName", userName);
        return query.List<Userdatasw>();
    }