0

在 nHibernate 中使用 Table per 具体方式为以下类层次结构创建 xml 映射文件时遇到一些问题。我不断收到“错误的类异常”错误。谁能帮我指出正确的方向?

这是我的抽象/父类的定义:

public abstract partial class AlertSpecification
{
    private long _alertSpecificationId;
    private string _specificationName;
    private bool _active;
    private int _createdBy;
    private DateTime _createdOn;

    public virtual long AlertSpecificationId
    {
        get { return _alertSpecificationId; }
        set { _alertSpecificationId = value; }
    }

    public virtual string SpecificationName
    {
        get { return _specificationName; }
        set { _specificationName = value; }
    }

    public virtual bool Active
    {
        get { return _active; }
        set { _active = value; }
    }

    public virtual int CreatedBy
    {
        get { return _createdBy; }
        set { _createdBy = value; }
    }

    public virtual DateTime CreatedOn
    {
        get { return _createdOn; }
        set { _createdOn = value; }
    }
}

这是我的第一个子类的定义:

public partial class ComponentSpecification : AlertSpecification
{
    private string _vehicleType;

    public virtual string VehicleType
    {
        get { return _vehicleType; }
        set { _vehicleType = value; }
    }          
}

这是我的第二个子类的定义:

public partial class ColdVehicleSpecification : AlertSpecification
{
    private double _sigmaThreshold;

    public virtual double SigmaThreshold
    {
        get { return _sigmaThreshold; }
        set { _sigmaThreshold = value; }
    }        
}

这是我的映射文件的定义:

<?xml version="1.0" encoding="utf-8"?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"        

     namespace="IS.QueryPerformanceTest.Model" assembly="IS.QueryPerformanceTest.Model" >
        <class name="AlertSpecification" abstract="true">
        <cache usage="read-write"/>    
       <id name="AlertSpecificationId" type="Int64">      
           <generator class="hilo"/>
       </id>
    <property name="SpecificationName" column="Name" />
    <property name="Active" />
    <property name="CreatedBy" />
    <property name="CreatedOn" />  
    <union-subclass name="ColdVehicleSpecification"   table="AlertSpecificationColdVehicle">
        <property name="SigmaThreshold" column="CVSigmaThreshold" />      
    </union-subclass>   
    <union-subclass name="ComponentSpecification" table="AlertSpecificationComponent">
        <property name="VehicleType" column="VehicleType" />      
    </union-subclass>
    </class>
</hibernate-mapping>

在我的控制器中,我使用以下代码检索数据:

var repo = new NHComponentSpecificationRepository(ObjectFactory.GetInstance<ISession>

());

var cvRepo = new 

NHColdVehicleSpecificationRepository(ObjectFactory.GetInstance<ISession>());

var allComponentSpecs = repo.FindAll();
var allColdVehicleSpecs = cvRepo.FindAll();

这是我得到的错误:ID 为 1 的对象不是指定的子类:IS.QueryPerformanceTest.Model.ColdVehicleSpecification(加载对象属于错误的类 [IS.QueryPerformanceTest.Model.ComponentSpecification])

请注意,对 repo.FindAll() 的第一次调用以正确的类型返回正常。然而,第二次通话失败。由于某些原因,即使我在代码中指定加载 ColdVehicleSpecification,它也总是尝试加载 ComponentSpecification。

这是 NHColdVehicleSpecificationRepository 中 FindAll 的实现:

public IList<ColdVehicleSpecification> FindAll()
{
    var result = _session.Query<ColdVehicleSpecification>().ToList();

    return result;
}

有谁知道这里有什么问题?

如果您需要更多信息,请告诉我。

提前致谢。

4

1 回答 1

0

层次结构有一个 ID 生成器。当您加载 ID 为 1 的对象时,NH 会找到有问题的类型。如果您尝试将其加载为其他类型,则会崩溃。

ComponentSpecification cs = new ComponentSpecification ();
session.Store(cs);
var csId = cs.Id;

// later on,
// crashes with a cast exception
var cvs = session.Get<ColdVehicleSpecification>(csId);

如果这不是问题,您需要提供一些代码。

于 2012-09-24T07:58:00.660 回答