使用NHibernate映射和抽象类

时间:2016-02-23 16:57:33

标签: c# nhibernate orm

我正在尝试映射一个其他两个类将继承的类,我希望将其设为抽象,这样我就能返回一个包含两种子对象的列表,并在父对象中使用一个鉴别器进行相应的转换类。

有关我的代码示例,BD如下所示: enter image description here

以下是我的域模型:

public class Person
{
    public int id {get; set;}
    public string name{get; set;}
}

public class Teacher : Person
{
    public string subject{get; set;}
}

public class Student : Person
{
    public string grade{get; set;}
}

我的Nhibernate映射:

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="Domain.Model" assembly="Domain" xmlns="urn:nhibernate-mapping-2.2" auto-import="false">
    <class name="Person" table="`Person`" schema="`PR`">
        <id name="id" access="property" column="`id`">
            <generator class="identity"/>
        </id>

        <property name="id" type="int" column="`id`" />
        <property name="name" type="String" column="`name`" />

        <joined-subclass name="Teacher" table="`Teacher`" schema="`PR`">
            <key column="`id`" />
            <property name="subject" type="String" column="`subject`" />
        </joined-subclass>
        <joined-subclass name="Student" table="`Student`" schema="`PR`">
            <key column="`id`" />
            <property name="grade" type="String" column="`grade`" />
        </joined-subclass>
    </class>
</hibernate-mapping>

我希望将我的“Person”类抽象化,这样我就可以有一个包含两种子类型的列表,但我不知道该怎么做

1 个答案:

答案 0 :(得分:1)

Polymorphism不要求基类是抽象的。您可以处理包含List<Person>Teacher个实例的Student,而无需Person抽象。

在代码中将Person设置为抽象,仅禁止创建Person实例。

Person设置为NHibernate映射中的抽象,每个子类使用一个&#39;表&#39; model告诉NHibernate Person表必须在其中一个子类表中有相应的条目。如果您的数据库包含Person中的某些行,而StudentTeacher中没有任何相应的行,那么这是一个错误。

也许这个blog可以帮助您更好地理解您应该做些什么。