【问题标题】:nhibernate cascade - problem with detached entitiesnhibernate cascade - 分离实体的问题
【发布时间】:2009-09-09 07:58:59
【问题描述】:

我在这里发疯了,试图解决级联更新/删除问题:-)

我有一个包含子实体集合的父实体。如果我修改分离的父对象中的子实体列表,添加、删除等 - 我没有看到更新正确级联到子集合。

映射文件:

  <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

【问题讨论】:

  • 你的父类中子列表的类型是什么?
  • 你能发布你的问题的解决方案吗?简单地说你把它整理出来是没有帮助的。
  • 我遇到了类似的问题,但无法解决。您能否详细说明您是如何解决此问题的?请!

标签: nhibernate cascade


【解决方案1】:

我一直在努力解决类似的问题。不确定我的解决方案是否适合您的问题,但请尝试使用 ISession.Merge 而不是 ISession.Update。

【讨论】:

  • 感谢您的回复!会话合并似乎可以完成我的删除。但是当需要首先清除子集合时,在以下情况下不起作用: Parent.Children.Clear() 'then inserts Parent.AddChild(child1);父.AddChild(child2); session.Merge(父);我得到的只是插入,而不是清除集合所需的初始删除......让我发疯,因为这必须是一个常见的要求!
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多