2011-08-25 80 views
1

我有一個對象,我試圖堅持一個遺留數據庫與NHibernate。我擁有映射到我的域對象中的表中的所有相關列,但表中有幾個字段必須填充爲遺留數據庫的結構。添加未映射的數據到NHibernate

遵循一些建議,我創建並註冊了一個NHibernate攔截器來爲我做這件事。

public class CustomLineItemInterceptor : EmptyInterceptor 
{ 

    public override bool OnSave(object entity, object id, object[] state, string[] propertyNames, IType[] types) 
    { 
    var lineItem = entity as SomeCustomLineItem; 

    if (lineItem == null) 
    return false; 


    List<string> propertyNameList = propertyNames.ToList(); 
    List<IType> typeList = types.ToList(); 
    List<object> stateList = state.ToList(); 

    propertyNameList.Add("Source"); // the unmapped column in the database 
    typeList.Add(NHibernateUtil.String); 
    stateList.Add("My Application's Name"); // the value I need to persist 

    state = stateList.ToArray(); 
    propertyNames = propertyNameList.ToArray(); 
    types = typeList.ToArray(); 

    return true; 
    } 
} 

我已經看了這個NHibernate add unmapped column in interceptorUnmapped Columns in NHibernate?沒有找到答案。

我所看到的是OnSave方法會觸發,但是我沒有在數據庫中存儲任何內容(或由NHibernate生成的SQL查詢)。

我在做什麼錯?

+0

你有訪問NHProfiler(如果不是爲什麼嗎?)?它向你展示了什麼? –

+0

它顯示在未添加新參數的情況下執行的查詢。 – reallyJim

+0

爲什麼不映射此屬性'公共虛擬字符串來源{得到{返回「我的應用程序的名稱」; } private set {}}'? – dotjoe

回答

3

還有this使用虛擬屬性和IPropertyAccessor的方法。我在域模型中的一個項目中使用了它,對於我來說,在映射中比在任何地方打開一個會話更容易宣告一次會話,這會發生在幾個不同的項目中(應用程序,導入,ETL,其他程序的集成)

+0

好的,這是我已經完成的方法來實現它的工作。我仍然好奇爲什麼我不能通過攔截器來做到這一點。 – reallyJim

1

我對NHibernate Interceptor的工作原理並不瞭解,但我不希望改變傳入的數組變量實際上會改變方法外部的任何東西。爲了使新數組最終返回到方法之外,它們需要通過引用(ref)參數傳遞。

看看你的第一個linked question (add unmapped column in interceptor),跳出的第一個區別是在他的方法結束時,他調用傳遞更新參數的基本方法(return base.OnSave(entity, id, state, propertyNames, types);)。也許這會有所幫助?

+0

謝謝 - 我確實錯過了這一點 - 但是在添加了該行後,我仍然看不到生成的SQL Insert中的更改。 – reallyJim