2009-11-06 68 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