我在使用nHibernate中的具体方式使用Table创建下面的类层次结构的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()会返回正确的类型。然而,第二次通话失败了。由于某些原因,它总是尝试加载ComponentSpecification,即使我已在代码中指定加载ColdVehicleSpecification。
这是NHColdVehicleSpecificationRepository中的FindAll的实现:
public IList<ColdVehicleSpecification> FindAll()
{
var result = _session.Query<ColdVehicleSpecification>().ToList();
return result;
}
有没有人知道这里有什么问题?
如果您需要更多信息,请与我们联系。
提前致谢。
答案 0 :(得分: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);
如果这不是问题,则需要提供一些代码。