2013-05-07 113 views
0

我與已經通過以下方式被映射到其域模型的工作工作的正確方法:NHibernate的,與代理

  • IProxy合同(包括身份證)
  • 實體類實現合同

實施例:

public class Product : IProductProxy {} 

類使用以下邏輯映射:

<class name="Product" table="[Products]" lazy="true" proxy="IProductProxy"> 

現在我發現下面的方法正常工作:

var result = session.Load<IProductProxy >(1); 
var result = session.Get<IProductProxy>(1); 
var result = session.Get<Product>(1); 

雖然這些方法拋出「代理例外」或「無效強制轉換異常」

var result = session.Load<Product>(1); 

我需要知道的是,使用代理和NHibernate的正確方式是什麼。例如,我雖然是直接與界面的工作就可以了,但是當我嘗試這樣做:

// successful save 
var result = session.Get<Customer>("ALFKI"); 
result.Name = "XXX"; 
session.Update(result); 

// if error occurs I receive wrong exception 
// cannot find mapping for ICustomerProxy ERROR 
var result = session.Get<ICustomerProxy>("ALFKI"); 
result.Name = "XXX"; 
session.Update(result); 

我就應該總是轉換回IProxy或者我應該用我的實體類型?

+0

提供自己的代理接口的原因是什麼? – cremor 2013-05-07 10:47:37

+0

這不是問題 – Raffaeu 2013-05-07 12:37:32

+0

提供自己的代理接口不是NHibernate代理的正常用法。如果我們知道你爲什麼這樣做,我們可能會更好地幫助你。 – cremor 2013-05-08 06:01:28

回答

1

var result = session.Load<Product>(1);無法正常工作。 Load()如果實體尚未處於會話中,則返回代理。如果您告訴NHibernate該實體類型的代理只需要實現IProductProxy接口,那麼NHibernate應該如何創建Product類型的代理(繼承類)?

+0

這是我正在尋找的答案。不幸的是,我沒有在文檔中發現Load總是返回代理對象。 – Raffaeu 2013-05-08 06:06:24