2017-04-09 35 views
0

這裏是我的代碼NHibernate的不一致的抓取行爲

if (des.X == null) 
{ 
    if (src.IsL) 
    { 
     des.X = new Y(); 
     var l = lRepo.Find().Where(file => file.Id == src.drId).First(); 
     ((Y)des.X).L = l; 
    } 
    else 
    { 

     D d = dRepo.Get(src.DrugId); 
     if (d is N) 
     { 
      des.X = new Y(); 
      ((Y)des.X).D = d; 
      ((Y)des.X).L = ((N)d).L; 
     } 
     else 
     if (d is IF) 
     { 
      des.X = new IeI(); 
      des.X.D = d; 
     } 
    } 
} 

,當我問if (d is N)

在第一次當我發送一個創建請求,並給我寄了N ID的問題發生,它的計算結果它是真實的,但是當我發送相同的數據進行更新時,它將其評估爲假。

我有點困惑,我沒有合理的解釋,所以任何人都可以幫助我解決這個問題。

更新它時會返回一個代理,但創建它時會返回一個正常實體。

在這種情況下,Untrack和非延遲加載解決方案可以工作,但我不認爲它們是有效的解決方案。

請任何幫助。

回答

1

您可能獲得映射基類的代理。它來自基類,而不是來自你的具體類,導致你的類型測試失敗。

沒有關於您的模型的更多細節,我只能提出一個最壞的解決方案。 (這將是最好避免在您必須處理試驗基地類代理的類型與預期的具體類型的情況是)

在你的基類,補充一點:

public virtual Type GetUnproxiedType() 
{ 
    return GetType(); 
} 

變化您的測試:

if (typeof(NonInfantDrugRegistration).IsAssignableFrom(
    drugRegistration.GetUnproxiedType())) 

這應該工作,因爲NHibernate的代理重定向到調用方法和屬性,除外id和屬於對象類型(和其他一些)的方法。它將呼叫重定向到一個具體的未經實例化的實例,它將動態創建並在第一次呼叫時加載重定向。這個具體實例不會是代理,並且會具有預期的類型。因此,上面的GetUnproxiedType方法將被重定向到一個未提交的NonInfantDrugRegistration,然後它將返回您的具體類型。