我有一个类层次结构:
Public MustInherit Class SystemSetting
Public Property System As Integer
Public Property Sequence As Integer
Public Property Description As String
Public Property Notes As String
End Class
Public MustInherit Class SystemSetting(Of T)
Inherits SystemSetting
Public MustOverride Property Value As T
End Class
Public NotInheritable Class StringBasedSystemSetting
Inherits SystemSetting(Of String)
Public Overrides Property Value As String
End Class
我有一个映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="SystemSettings"
namespace="SystemSettings"
default-lazy="false">
<class xmlns="urn:nhibernate-mapping-2.2"
name="SystemSetting"
abstract="true">
<composite-id>
<key-property name="System" column="SystemId"/>
<key-property name="Sequence" column="SettingSeq"/>
</composite-id>
<discriminator column="SettingType" not-null="true" force="false"/>
<property name="Description" column="SettingDescription"/>
<property name="Notes" column="SettingNotes"/>
<subclass name="StringBasedSystemSetting" discriminator-value="T">
<property name="Value" column="SettingText"/>
</subclass>
</class>
</hibernate-mapping>
此映射创建正确的架构,并允许我成功保存和刷新对象。但是,当我通过LINQ或QueryOver查询时,我得到了异常:
Cannot instantiate abstract class or interface
我可以通过删除SystemSetting类的抽象性来解决这个问题。但是,如果可能的话,我不想妥协我的班级设计。为什么当我的映射在其抽象性质上清楚并且使用类型鉴别器时NH是否尝试创建SystemSetting的实例?
更新 如果我用指定的Id替换复合Id,它就可以工作。
答案 0 :(得分:2)
我找到了答案。当使用复合Id时,NH必须使用映射类的实例来表示Id。这就是它试图实例化SystemSetting而不管'abstract'映射属性的原因。
更改设计以便将复合Id表示为其自己的类型可以解决问题。我的基类仍然是抽象的,我的查询现在可以工作。