Есть следующий маппинг:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
<class name="Payment" table="Payment" lazy="true">
<id name="ID" column="id" type="Int32">
<generator class="native" />
</id>
<version name="Version" column="version" unsaved-value="-1"/>
<!--CashPayment-->
<joined-subclass name="CashPayment" table="CashPayment">
<key column="id_payment" />
</joined-subclass>
<!--ChequePayment-->
<joined-subclass name="ChequePayment" table="ChequePayment">
<key column="id_payment" />
</joined-subclass>
</class>
</hibernate-mapping>
По совету GarryIV пробую использовать метод Lock(cashPayment, LockMode.Force) для принудительного увеличения версии объекта.
При этом получаю исключение:
Hibernate operation: could not retrieve version: [CashPayment#1][SQL: SELECT version FROM Payment WHERE id = ?]; bad SQL grammar [SELECT version FROM Payment WHERE id = ?]; Invalid column name 'id_payment'.
SQL, который генерирует NHibernate такой:
exec sp_executesql N'UPDATE Payment SET version = @p0 WHERE id_payment = @p1 AND version = @p2',N'@p0 int,@p1 int,@p2 int',@p0=2,@p1=1,@p2=1
Т.е. таблицу он указывает для базового типа, что правильно, но имя столбца идентификатора берет из таблицы производного типа СashPayment — "id_payment", что, естественно, не правильно.
Пробовал вызывать методы:
Lock("Payment", cashPayment, LockMode.Force)
и
Lock("CachPayment", cashPayment, LockMode.Force)
но это ничего не дает.
Даже вызывая
Lock("aaaaaaa", cashPayment, LockMode.Force)
где "aaaaaaa" — несуществующий тип NHibernate все равно падает с той же ошибкой.
Сейчас переименовал столбцы в таблицах производных типов, чтобы совпадали с названием столбца базового типа (т.е. "id"), и все заработало, но все равно хотелось бы понять что я делаю не правильно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>