1

我必须通过NHibernate访问一组存储过程。流利的NHibernate映射一个存储过程,返回一组动态的列

其中一个存储过程返回一个结果,但根据传入的参数返回的列是不同的。

例如,如果我传递的日期2014年1月1日和2015年1月1日我如果我通过在不同的日期范围内的存储过程可能会返回不同组列例如可能得到的结果

列1,列2,栏3

然而

列1,列2,栏3,column4,column5,column6

我怎么能这样映射到实体?

是否有可能以某种方式映射所有列可能会回来,然后只是设置属性为空如果列不从存储过程回来?

public class ModelMap : ClassMap<Model> 
    { 
     public ModelMap() 
     { 
      this.ReadOnly(); 
      this.Id(x => x.Date); 
      this.Map(x => x.Column1) 
      this.Map(x => x.Column2) 
      this.Map(x => x.Column3) 
      this.Map(x => x.Column4) 
      this.Map(x => x.Column5) 
      this.Map(x => x.Column6)    
     } 
    } 

关于如何让这种类型的存储过程映射到实体的任何想法?

+0

手动变换的结果在看看:http://stackoverflow.com/questions/16415877/fluent -nhibernate-to-query-stored-procedure-without-hbm-xml-mapping – Jedediah 2014-12-03 15:28:56

+0

是的,这是我所做的,但在我的'MyDomainObject'.AddEntity(typeof(MyDomainObject))的一些属性是不是从存储过程返回,有时它们完全取决于传入的参数。因此,当存储过程不返回它时会中断它。 – 2014-12-03 15:41:39

+0

也许尝试:Map(x => x.Column1).Nullable(); – Jedediah 2014-12-03 16:46:41

回答

3

,而不是有一个动态映射,你可以使用的SQLQuery发出查询和使用结果变压器

public List<Model> CallFoo(ISession session, DateRange range) 
{ 
    return session.CreateSqlQuery("call sproc") 
     .SetParameter(...) 
     .SetResultTransformer(new ModelResultTransformer()) 
     .List<Model>(); 
} 

class ModelResultTransformer : NHibernate.Transform.IResultTransformer 
{ 
    public IList TransformList(IList collection) 
    { 
     return collection; 
    } 

    public object TransformTuple(object[] tuple, string[] aliases) 
    { 
     var model = new Model(); 
     for (int i = 0; i < aliases.Length; i++) 
     { 
      var columnName = aliases[i]; 
      var value = tuple[i]; 
      switch (columnName) 
      { 
       case "column1": 
        model.Prop1 = (string)value; 
        break; 
       case "column2": 
        model.Prop2 = (int)value; 
        break; 
       case "column3": 
        model.Prop1 = (int)value; 
        break; 
      } 
     } 
    } 
}