在 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;
}
有谁知道这里有什么问题?
如果您需要更多信息,请告诉我。
提前致谢。