我正在尝试使用NHibernate映射实体层次结构,几乎所有这些都有事件。但是,在尝试构建会话工厂时,我收到类似于以下内容的错误消息:
Core.Domain.Entities.Delivery:方法 remove_Scheduled应该是虚拟的
投放是我的域模型中的一个实体,其中包含一个名为预定的事件。由于事件不能被宣布为虚拟,所以我不知道如何继续这里。为什么NHibernate需要事件是虚拟的?
答案 0 :(得分:2)
如果使用延迟加载,必须将公共成员声明为虚拟成员,因为NHibernate将在运行时为您的实体创建代理对象。所以不要使用延迟加载或只是将事件声明为虚拟 - 这不常见,但它是可能的。
NHibernate为所有延迟加载的实体创建代理类,并在引用但尚未加载的实体中使用它们。访问此代理会触发从数据库加载实际实体。这种方法需要在运行时从您的实体类继承并覆盖公共成员,因此这些成员是虚拟的。
还有另一种解决方案。您可以将proxy="ISomeInterface"
添加到类声明中。然后,您不需要虚拟成员,而代理只需实现给定的接口。
答案 1 :(得分:1)
我在延迟加载的对象上实现INotifyPropertyChanged时遇到了同样的问题。问题是您实际上处理了两个不同的.NET实例,因此当您在实际实例中触发NPC事件时,您将不会从对代理的任何引用中收到它。使其成为虚拟允许代理“转发”此事件。不幸的是,在VB.NET(2005)中将事件定义为虚拟/可覆盖是不可能的,因此我们不得不引入一个C#项目,其基类仅实现这些虚拟事件以解决VB问题。另见https://forum.hibernate.org/viewtopic.php?f=25&t=990162&start=0
如果还有其他方法我会热衷于了解自己,因为我们的方法使得代理的透明度比它们应该少一些。当需要初始化延迟加载的对象时,自动重新连接会话的区域似乎有点痛苦。
此致 西奥
答案 2 :(得分:0)
您的地图如何? 你有没有映射事件?
之前我没有遇到过这个问题,但是,我再次在类映射中指定'lazy = false'属性,这样我的属性就不必声明为virtual。 (因为我不喜欢将属性声明为虚拟,如果我的商业模式不需要这个)
<class name="MyClass" table="MyTable" lazy="false">
</class>