2012-04-12 59 views
0

誰能幫我一些想法?下面是我的問題。 假設我有一個名爲A的實體,其字段爲A1,A2,A3和A4,而且我有3個存儲過程,它只從表A返回數據。在Nhibernate填充entites

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

返回A1,A2的第一個存儲過程 第二個存儲過程返回A1,A2,A3 第三個存儲過程單獨返回A1。

對於上述方案做我需要創建三個不同的映射,或者是有什麼解決辦法?如何處理這種情況與單個實體和更低的變化代碼.......

MY場景:

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,我們需要創建單獨映射?

任何想法將不勝感激。

謝謝, Venkatesh。 J

回答

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>(); 
    }