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