NHibernate - Таблица наследования подклассов, вызывающая исключения "Invalid Cast" - PullRequest
1 голос
/ 04 апреля 2011

У меня есть простое наследование таблиц на подклассы со следующим отображением 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>

Таким образом, как кредитная карта, так и банковский счет наследуются от "Billing Detail".В моем доменном слое у меня есть следующее утверждение:

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 (проверьте соответствие на предмет несоответствия типов свойств); setter of BankAccount "

Если я установил точку останова в операторе" var billingDetail ... "и запустил программу для проверки этой ошибки, я вижу сообщение выше.Однако, если я затем нажму кнопку воспроизведения, чтобы продолжить выполнение программы, вместо того, чтобы начинать с вышеприведенного сообщения, программа будет успешно запущена и введет все данные в базу данных.Без проверки точки останова программа вылетает (как я и ожидал, если на самом деле есть проблема с сопоставлениями).

Кажется, что происходит то, что каждый раз, когда она видит сущность «BankAccount», она выдает исключение, но все объекты кредитной карты в порядке.Что-то не так с «OfType», что он не отфильтровывает объекты BankAccount?

1 Ответ

0 голосов
/ 06 апреля 2011

Ответить тут не было ничего интересного. Я должен был уделить больше внимания полной ошибке, которая гласила:

Invalid Cast (проверьте соответствие на предмет несоответствия типов свойств)

Когда я сделал то, что мне сказала ошибка, я увидел столбец, который был отображен как Int32, но должен был быть Int64. Не очень умно с моей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...