nhibernate级联-分离实体的问题
我在这里发疯,试图解决一个级联更新/删除问题:-) 我有一个父实体和一个集合子实体。如果我修改分离的父对象中的子实体列表,添加、删除等-我看不到正确级联到子集合的更新 映射文件:nhibernate级联-分离实体的问题,nhibernate,cascade,Nhibernate,Cascade,我在这里发疯,试图解决一个级联更新/删除问题:-) 我有一个父实体和一个集合子实体。如果我修改分离的父对象中的子实体列表,添加、删除等-我看不到正确级联到子集合的更新 映射文件: <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain"> <class name="Par
<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();
}
}
[测试]
公开无效测试()
{
Guid id;
int-lastModified;
//将一个子项添加到第一个会话中,然后分离
使用(ISession session=Store.Local.Get(“SessionFactory”).OpenSession())
{
Console.Out.WriteLine(“选择…”);
Parent Parent=(Parent)session.Get(typeof(Parent),新Guid(“4bef7acb-bdae-4dd0-ba1e-9c7500f29d47”);
id=parent.id;
lastModified=parent.lastModified+1;//确保以后使用的分离版本与持久版本相同
Console.Out.WriteLine(“添加子…”);
Child=(从session.Linq()中的c选择c.First();
parent.AddChild(child,0m);
session.Flush();
session.Dispose();//不需要我知道
}
//附加父级,然后保存,不包含子级
使用(ISession session=Store.Local.Get(“SessionFactory”).OpenSession())
{
母公司=新母公司(“测试”);
parent.Id=Id;
parent.LastModified=LastModified;
更新(家长);
session.Flush();
}
}
我假设产品已更新,其集合中没有子项——子项将在Parent_Child表中删除。问题似乎与将产品附加到新会话有关?由于cascade设置为all delete orphan,我假设对集合的更改将传播到相关的实体/表?在这种情况下,删除
我错过了什么
我一直在为类似的问题绞尽脑汁。不确定我的解决方案是否适合您的问题,但请尝试使用ISession.Merge而不是ISession.Update。您的父类中的子类列表类型是什么?您可以发布问题的解决方案吗?简单地说你已经解决了这件事是没有帮助的。我面临着一个类似的问题,并且还没有能够解决它。您能否提供您如何解决此问题的详细信息?请谢谢你的回复!会话合并似乎可以完成我的删除。但在以下需要首先清除子集合的情况下不起作用:Parent.Children.Clear()'然后插入Parent.AddChild(child1);父母。添加子女(子女2);会话。合并(父级);我得到的只是插入,而不是清除集合所需的初始删除。。。让我发疯,因为这一定是一个共同的要求!