NHibernate无法创建抽象类的实例

时间:2014-06-12 12:24:38

标签: nhibernate

我有一个类层次结构:

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,它就可以工作。

1 个答案:

答案 0 :(得分:2)

我找到了答案。当使用复合Id时,NH必须使用映射类的实例来表示Id。这就是它试图实例化SystemSetting而不管'abstract'映射属性的原因。

更改设计以便将复合Id表示为其自己的类型可以解决问题。我的基类仍然是抽象的,我的查询现在可以工作。