NHibernate: parent + child
От: AlSer Беларусь  
Дата: 30.11.09 10:23
Оценка:
Добрый день
Пытаюсь прикрутить 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>>
Re: NHibernate: parent + child
От: meowth  
Дата: 30.11.09 14:15
Оценка: 2 (1)
Здравствуйте, 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>
Re: NHibernate: parent + child
От: Stan B http://stan-belkin.blogspot.com
Дата: 30.11.09 14:34
Оценка: 2 (1)
например вот так:

  <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>
Re[2]: NHibernate: parent + child
От: AlSer Беларусь  
Дата: 30.11.09 15:03
Оценка:
Здравствуйте, meowth, Вы писали:

M>Здравствуйте, AlSer, Вы писали:


AS>>Как разрулить?


M>Чтением мануалов. Потому как там написано, что в случае composite-id...


спасибо, сработало
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: NHibernate: parent + child
От: AlSer Беларусь  
Дата: 30.11.09 15:03
Оценка:
Здравствуйте, 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>>
Re[3]: NHibernate: parent + child
От: Stan B http://stan-belkin.blogspot.com
Дата: 30.11.09 16:26
Оценка: 2 (1)
Здравствуйте, 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 как класса.
Re[4]: NHibernate: parent + child
От: AlSer Беларусь  
Дата: 01.12.09 07:00
Оценка:
Здравствуйте, Stan B, Вы писали:

SB>Здравствуйте, AlSer, Вы писали:


AS>>спасибо, за вариант, но что-то я видимо не так сделал — количество Units совпадает,

AS>>но все поля у них — нулевые
SB>наверное забыл смапировать их как пропертис внутри composite-element?
...
SB>вложенный composite-element заменяет отдельное мапирование Unit как класса.

точно. так тоже работает — еще раз спасибо
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.