2009-09-09 2 views
2

Я схожу с ума здесь пытаются разрешить каскадное обновление/удаление вопрос :-)NHibernate каскад - проблема отдельных лиц

У меня есть родительский объект с коллекцией дочерних объектов. Если я изменяю список дочерних объектов в отдельном родительском объекте, добавляя, удаляя и т. Д. - я не вижу, чтобы обновления были правильно каскадированы в коллекции Child.

Отображение файлов:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Domain" 
        namespace="Domain"> 

    <class name="Parent" table="Parent" > 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <property name="Name" type="String" length="250" /> 

    <bag name="ParentChildren" lazy="false" table="Parent_Children" cascade="all-delete-orphan" inverse="true"> 
     <key column="ParentId" on-delete="cascade" /> 
     <one-to-many class="ParentChildren" /> 
    </bag> 

    </class> 

    <class name="ParentChildren" table="Parent_Children"> 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <many-to-one 
    name="Parent" 
    class="Parent" 
    column="ParentId" 
    lazy="false" 
    not-null="true" 
     /> 
    </class> 
</hibernate-mapping> 

Тест

[Test] 
    public void Test() 
    { 
     Guid id; 
     int lastModified; 
     // add a child into 1st session then detach 
     using(ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Console.Out.WriteLine("Selecting..."); 
      Parent parent = (Parent) session.Get(typeof (Parent), new Guid("4bef7acb-bdae-4dd0-ba1e-9c7500f29d47")); 

      id = parent.Id; 
      lastModified = parent.LastModified + 1; // ensure the detached version used later is equal to the persisted version 

      Console.Out.WriteLine("Adding Child..."); 
      Child child = (from c in session.Linq<Child>() select c).First(); 
      parent.AddChild(child, 0m); 

      session.Flush(); 
      session.Dispose(); // not needed i know 
     } 

     // attach a parent, then save with no Children 
     using (ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Parent parent = new Parent("Test");    

      parent.Id = id; 
      parent.LastModified = lastModified; 

      session.Update(parent); 
      session.Flush(); 
     } 
    } 

Я полагаю, что тот факт, что продукт был обновлен не иметь детей в своей коллекции - дети будут удалены в таблице Parent_Child. Проблемы, похоже, связаны с присоединением продукта к новой сессии? Поскольку для каскада установлено значение all-delete-orphan, я предполагаю, что изменения в коллекции будут распространены на соответствующие сущности/таблицы? В этом случае удаляет?

Что мне здесь не хватает?

C

+0

Каков тип списка детей в вашем родительском классе? – Beatles1692

+1

Можете ли вы разместить решение проблемы? Просто сказать, что вы разобрали его, не помогает. –

+0

Я столкнулся с подобной проблемой и не смог ее решить. Можете ли вы предоставить подробную информацию о том, как вы решили эту проблему? Пожалуйста! – skrishna

ответ

2

Я боролся с подобной проблемой. Не уверен, будет ли мое решение соответствовать вашей проблеме, но попробуйте использовать ISession.Merge вместо ISession.Update.

+0

Спасибо за ответ! Слияние сеансов похоже на работу с моими удалениями. Но не работает по мере необходимости в следующей ситуации, когда сначала необходимо очистить коллекции Child: Parent.Children.Clear() 'затем вставляет Parent.AddChild (child1); parent.AddChild (child2); session.Merge (parent); Все, что я получаю, это вставки, а не начальное удаление, необходимое для очистки коллекции ... Вождение меня гайками, поскольку это должно быть общим требованием! – 2009-09-10 06:23:57

+0

Странно ... это сработало в моем случае. – maciejkow

+0

Отсортировано - спасибо миллион! – 2009-09-18 10:09:54

Смежные вопросы