2009-04-17 4 views
1

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

<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 не сохраняются?

+0

вы могли бы опубликовать немного ваш код, чтобы показать, как ваши объекты создаются а также установили отношения, а затем спасены? Ваше сопоставление выглядит хорошо, поэтому я предполагаю, что это связано с кодом. –

ответ

7

Для того, чтобы команда обновления распространяется на все ребенок заказа, Вам необходимо включить каскадные обновления на вашем картографировании коллекции:

<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(); 
} 
+0

исправьте меня, если я ошибаюсь. В NHibernate устанавливаются только двунаправленные отношения, а не список. –

+0

он объявил <свойство name = "OrderID" /> внутри OrderItem. Это необходимо? –

5

Добавить cascade="all" в вашу коллекцию картографических данных.