2009-11-06 64 views
2

我有一個由MyGeneration爲我自動生成的域對象。這是使用NHbernate模板生成的。這是對象的一部分 - 我已刪除了大部分,導致NHibernate錯誤的域對象

[Serializable] 
public class Purchase : INotifyPropertyChanged 
{ 
    protected int id; 

    public event PropertyChangedEventHandler PropertyChanged; 

    public virtual int Id 
    { 
     get { return id; } 
     set {if (value != this.id){id= value;NotifyPropertyChanged("Id");}} 
    } 
} 

當我試圖挽救這些對象之一到數據庫中,我得到一個異常

NHibernate.InvalidProxyTypeException:以下內容不得作爲代理: NHibernateDemo.DataLayer.Entities.Purchase:方法add_PropertyChanged應該是「公共/受保護的虛擬」

等等。所以,如果我改變這一行

public event PropertyChangedEventHandler PropertyChanged; 

要這個......

public virtual event PropertyChangedEventHandler PropertyChanged; 

它的工作原理,但對我來說這似乎不是一個很好的解決方案。 NHibernate正在處理那個事件屬性,就像它是一個將要保存到數據庫中的字段一樣。有沒有一種方法可以讓NHibernate忽略它?

如果我把它變成'虛擬事件',你認爲WPF綁定仍然可以使用它嗎?

回答

3

該異常意味着NHibernate不能創建對象的動態代理,因爲該事件不是虛擬的。 NH爲你的對象創建一個代理來允許延遲加載。你的解決方案很好。

+0

我的解決方案很好嗎?所以使它虛擬將WPF綁定工作正常,你在說什麼? – peter 2009-11-06 01:35:34

+0

您需要將它變爲虛擬才能使NHibernate的延遲加載策略發揮作用。我預計WPF綁定可以正常工作,但我沒有任何經驗。聲明必須是虛擬的,以便NH可以爲您的對象創建代理;數據綁定將與代理一起工作,就好像它是真實的對象一樣。 – 2009-11-06 12:24:27

+1

你說解決方案很好,因爲它可以工作,但對我來說這很愚蠢。 NHibernate強制事件是虛擬的,而事實上它並不是必須的,因爲它不包含任何狀態。 除此之外,它也是一個限制:如果事件在基類中聲明並且在那裏不是虛擬的呢?在你的類中隱藏和重新創建事件將不起作用,因爲NHibernate一直在拋出異常。 – 2016-07-08 16:40:26

0

您必須在NHibernate映射文件中顯式映射此屬性。查看生成的hbm.xml文件,並從映射文件中移除該屬性,以便NHibernate將忽略它。

+0

你是說我必須將這個字段映射爲這個特定的錯誤發生?這似乎並非如此。在我的映射文件中沒有映射到PropertyChanged事件 – peter 2009-11-06 01:36:05