Добрый день
Пытаюсь прикрутить NHibernate к существующей базе, т.е. база изменяться не будет и имеет след. структуру:
Messages Units
------- ---------
RecId int (PK) ParentRecId int
.... NumberByOrder tinyint
...
Примечание:
таблица Unit не имеет Primary Key, но подразумевается, что он
составной (ParentRecId,NumberByOrder) — это, к сожалению, нельзя изменить
Маппинги:
Message:
<class name="Message,Messages" table="Messages">
<id name="RecId" column="RecId" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
...
<set name="Units" table="Units"
generic="true" inverse="true">
<key column="ParentRecId" />
<one-to-many class="Unit" />
</set>
</class>
Unit:
...
<class name="Unit,Messages"
table="Units">
<composite-id>
<key-property name="Message" column="ParentRecId"
type="Int32" />
<key-property name="NumberByOrder" column="NumberByOrder"
type="Int32" />
</composite-id>
...
<many-to-one name="Message" column="ParentRecId"
class="Message,Messages" />
</class>
Классы:
Message:
public class Message
{
public virtual int RecId { get; protected set; }
...
public virtual ISet<Unit> Units
{ get; protected set; }
...
Unit
public class Unit
{
public virtual Message Message { get; protected set; }
public virtual int NumberByOrder { get; protected set; }
...
Запрошенную запись Message извлекает без ошибок,
но когда пытаюсь организовать перебор Units — выдает ошибку:
System.InvalidCastException: Unable to cast object of type 'System.Int32' to type 'XXX.Messages.Message'
Как разрулить?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, AlSer, Вы писали:
AS>Добрый день
AS>Пытаюсь прикрутить NHibernate к существующей базе, т.е. база изменяться не будет и имеет след. структуру:
AS>
AS>Unit:
AS>...
AS> <class name="Unit,Messages"
AS> table="Units">
AS> <composite-id>
AS> <key-property name="Message" column="ParentRecId"
AS> type="Int32" />
AS> <key-property name="NumberByOrder" column="NumberByOrder"
AS> type="Int32" />
AS> </composite-id>
AS> ...
AS> <many-to-one name="Message" column="ParentRecId"
AS> class="Message,Messages" />
AS> </class>
AS>
AS>Как разрулить?
Чтением мануалов. Потому как там написано, что в случае composite-id, если fk входит в составной pk, то его вхождение записывается не как key-property, а как key-many-to-one. Т.е. ваш маппинг для Unit должен выглядеть вот так:
<class name="Unit,Messages" table="Units">
<composite-id>
<key-many-to-one name="Message" column="ParentRecId" />
<key-property name="NumberByOrder" column="NumberByOrder" type="Int32" />
</composite-id>
</class>
например вот так:
<class name="Message" table="Messages">
<id name="RecId" column="RecId" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
...
<set name="Units" table="Units" generic="true" inverse="true">
<key column="ParentRecId" />
<composite-element class="Unit" >
<parent name="Message"/>
<property name="NumberByOrder" column="NumberByOrder" />
</composite-element>
</set>
</class>
Здравствуйте, meowth, Вы писали:
M>Здравствуйте, AlSer, Вы писали:
AS>>Как разрулить?
M>Чтением мануалов. Потому как там написано, что в случае composite-id...
спасибо, сработало
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, Stan B, Вы писали:
SB>например вот так:
SB>SB> <class name="Message" table="Messages">
SB> <id name="RecId" column="RecId" type="Int32" unsaved-value="0">
SB> <generator class="native" />
SB> </id>
SB> ...
SB> <set name="Units" table="Units" generic="true" inverse="true">
SB> <key column="ParentRecId" />
SB> <composite-element class="Unit" >
SB> <parent name="Message"/>
SB> <property name="NumberByOrder" column="NumberByOrder" />
SB> </composite-element>
SB> </set>
SB> </class>
SB>
спасибо, за вариант, но что-то я видимо не так сделал — количество Units совпадает,
но все поля у них — нулевые
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, AlSer, Вы писали:
AS>спасибо, за вариант, но что-то я видимо не так сделал — количество Units совпадает,
AS>но все поля у них — нулевые
наверное забыл смапировать их как пропертис внутри composite-element?
<class name="Message" table="Messages">
<id name="RecId" column="RecId" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="Name" length="50" />
<set name="Units" table="Units" generic="true" inverse="true">
<key column="ParentRecId" />
<composite-element class="Unit" >
<parent name="Message"/>
<property name="NumberByOrder" column="NumberByOrder" />
<property name="Prop1" column="Prop1" />
<property name="Prop2" column="Prop2" />
<property name="Prop3" column="Prop3" />
</composite-element>
</set>
</class>
вложенный composite-element заменяет отдельное мапирование Unit как класса.
Здравствуйте, Stan B, Вы писали:
SB>Здравствуйте, AlSer, Вы писали:
AS>>спасибо, за вариант, но что-то я видимо не так сделал — количество Units совпадает,
AS>>но все поля у них — нулевые
SB>наверное забыл смапировать их как пропертис внутри composite-element?
...
SB>вложенный composite-element заменяет отдельное мапирование Unit как класса.
точно. так тоже работает — еще раз спасибо
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>