NHibernate не сохраняет коллекцию объектов - PullRequest
1 голос
/ 17 апреля 2009

У меня есть класс Order, который содержит OrderItems. Когда я сохраняю класс Order, база данных заполняется информацией Order, но ни один из дочерних OrderItems не сохраняется в соответствующих таблицах. Вот как выглядит Порядок отображения:

<class name="Order" table="Orders">
<id name="OrderID" column="OrderID" type="Int64" unsaved-value="0">
  <generator class="identity"/>
</id>
<list name="OrderItems" table="OrderItems" inverse="true" >
  <key column="OrderID"/>
  <index column="OrderItemID" />
  <one-to-many class="OrderItem" />
</list>

Вот как выглядит отображение OrderItem:

<class name="OrderItem" table="OrderItems">
<id name="OrderItemID" column="OrderItemID" type="Int64" unsaved-value="0">
  <generator class="identity"/>
</id>
<property name="OrderID" />
<many-to-one name="Order" class="Order" column="OrderID" not-null="true" />
</class>

Вот как выглядит код для сохранения ордера:

if (o.CreatedBy == null || o.CreatedBy == string.Empty) {
       o.CreatedBy = userID.ToString();
       foreach (OrderItem oi in obj.OrderItems) {
           oi.CreatedBy = userID.ToString();
           oi.ModifiedBy = userID.ToString();
           oi.ModifiedOn = DateTime.Now;
        }
 }
 o.ModifiedBy = userID.ToString();
 o.ModifiedOn = DateTime.Now;
 ISession session = NHibernateHelper.GetCurrentSession();
 ITransaction tx = session.BeginTransaction();
 session.Save(o);
 tx.Commit();
 NHibernateHelper.CloseSession();

Есть идеи, почему дочерние элементы OrderItems не сохраняются?

Ответы [ 2 ]

7 голосов
/ 17 апреля 2009

Чтобы команда обновления распространялась на всех дочерних элементов Ордена, необходимо включить каскадные обновления в отображении вашей коллекции:

<list name="OrderItems" table="OrderItems" inverse="true" cascade="all">
  <key column="OrderID"/>
  <index column="OrderItemID" />
  <one-to-many class="OrderItem" />
</list>

Кроме того, поскольку коллекция помечена как «обратная» и - в приведенном выше примере - вы пытаетесь сохранить новый ордер, вам нужно будет отдельно обновить свойство OrderItem.Order и вызвать Update () для элемента:

using(ITransaction tx = session.BeginTransaction()){
    session.Save(o);
    foreach(var item in o.OrderItems){
        item.Order = o;
        session.SaveOrUpdate(item);
    }
    tx.Commit();
}
5 голосов
/ 17 апреля 2009

Добавьте cascade="all" к отображению вашей коллекции.

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