【问题标题】:NHibernate - Table per subclass inheritance causing "Invalid Cast" exceptionsNHibernate - 每个子类继承的表导致“无效转换”异常
【发布时间】:2011-07-29 09:25:15
【问题描述】:

我有一个简单的子类表继承,具有以下 NHibernate 映射

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-   cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="BillingDetail table="BillingDetails">
<id name="Id" type="System.Int32">
  <column name="Id" />
  <generator class="identity" />
</id>
<property name="DateAdded" type="System.DateTime">
  <column name="DateAdded" />
</property>    
<many-to-one class="Account name="Account">
  <column name="Account_id" />
</many-to-one>

<joined-subclass name="BankAccount table="BillingDetails_BankAccount">
  <key>
    <column name="Id"/>
  </key>
  <property name="AccountNumber" type="System.Int64">
    <column name="AccountNumber" />
  </property>
  <property name="SortCode" type="System.Int32">
    <column name="SortCode" />
  </property>
</joined-subclass>

<joined-subclass name="CreditCard table="BillingDetails_CreditCard">
  <key>
    <column name="Id" />
  </key>
  <property name="CardNumber" type="System.Int64">
    <column name="CardNumber" />
  </property>
  <property name="CardType" type="System.String">
    <column name="CardType" />
  </property>
  <property name="ExpiryDate" type="System.DateTime">
    <column name="ExpiryDate" />
  </property>
</joined-subclass>

</class>
</hibernate-mapping>

所以信用卡和银行账户都继承自“账单明细”。在我的领域层中,我有以下声明:

var billingDetail = (from a in unitOfWork.Context.BillingDetail.OfType<CreditCard>()
                            select a).FirstOrDefault();

上面的“unitOfWork.Context”属性只是让我可以访问 ISession 工作单元。当我运行应用程序时,我收到以下错误:

BillingDetail = 'unitOfWork.Context.BillingDetail' 引发了“NHibernate.PropertyAccessException”类型的异常 Message = "Invalid Cast (检查你的映射是否有属性类型不匹配);BankAccount 的设置器"

如果我在“var billingDetail...”语句处设置断点并运行程序来检查此错误,我可以看到上述消息。但是,如果我然后单击播放继续执行程序,而不是用上述消息轰炸,程序运行成功并将所有数据输入数据库。如果不检查断点,程序就会崩溃(如果映射确实存在问题,我会预料到)。

似乎正在发生的是,每次看到“BankAccount”实体时都会出现异常,但所有 CreditCard 实体都很好。 “OfType”是否有问题,它没有过滤掉 BankAccount 对象?

【问题讨论】:

    标签: nhibernate inheritance casting joined-subclass


    【解决方案1】:

    这里的答案没什么意思。我应该更加注意完整的错误,它说:

    无效的转换(检查您的映射是否有属性类型不匹配)

    当我执行错误告诉我的操作时,我看到一列被映射为 Int32 但应该是 Int64。我不是很聪明。

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多