我有一个由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绑定仍然可以使用它吗?
我的解决方案很好吗?所以使它虚拟将WPF绑定工作正常,你在说什么? – peter 2009-11-06 01:35:34
您需要将它变为虚拟才能使NHibernate的延迟加载策略发挥作用。我预计WPF绑定可以正常工作,但我没有任何经验。声明必须是虚拟的,以便NH可以为您的对象创建代理;数据绑定将与代理一起工作,就好像它是真实的对象一样。 – 2009-11-06 12:24:27
你说解决方案很好,因为它可以工作,但对我来说这很愚蠢。 NHibernate强制事件是虚拟的,而事实上它并不是必须的,因为它不包含任何状态。 除此之外,它也是一个限制:如果事件在基类中声明并且在那里不是虚拟的呢?在你的类中隐藏和重新创建事件将不起作用,因为NHibernate一直在抛出异常。 – 2016-07-08 16:40:26