.NET 企业库 知识分享--知识产生力量,成功源于分享!
RSS

导航







专业.NET技术社区

专业.NET技术社区


快速搜索

高级搜索 »

注意:此页面是NHibernate 1.0.1 中文文档的一部分。

对每个对象调用Save()方法很麻烦,我们可以用级联来解决这个问题。

<set name="Children" inverse="true" cascade="all">
	<key column="parent_id" />
	<one-to-many class="Child" />
</set>

配置级联以后,代码就简化了:

Parent p = session.Load( typeof( Parent ), pid ) as Parent;
Child c = new Child();
p.AddChild( c );
session.Flush();

注意:级联十分依赖unsaved-value属性(attribute)。请确保属性(property)的默认值和unsaved-value一样。

类似的,当保存或删除Parent时我们不需要遍历children。下面的代码从数据库中删除了p和它所有的children。

Parent p = session.Load( typeof( Parent ), pid ) as Parent;
session.Delete( p );
session.Flush();

然而,这段代码

Parent p = session.Load( typeof( Parent ), pid ) as Parent;
Child c = null;
foreach( Child child in p.Children ) 
{
	c = child; // only care about first Child
	break;
}

p.Children.Remove( c );
c.Parent = null;

session.Flush();

不会从数据库删除c;它只会删除与p之间的连接(并且会导致违反NOT NULL约束,在这个例子中)。你需要明确调用Child的Delete() 方法。

Parent p = session.Load( typeof( Parent ), pid ) as Parent;
Child c = null;
foreach( Child child in p.Children ) 
{
	c = child; // only care about first Child
	break;
}

p.Children.Remove( c );
c.Parent = null;

session.Delete( c );
session.Flush();

在我们的例子中,如果我们规定没有父对象的话,子对象就不应该存在,如果将子对象从collection中移除,实际上我们是想删除它。要实现这种要求,就必须使用cascade="all-delete-orphan"。

<set name="Children" inverse="true" cascade="all-delete-orphan">
	<key column="parent_id" />
	<one-to-many class="Child" />
</set>

注意:即使在collection一方的映射中指定iinverse="true",在遍历collection的时候级联操作仍然会执行。如果你想要通过级联进行子对象的插入、删除、更新操作,就必须把它加到collection中,只调用Child.Parent 的setter是不够的。

顶部
.NET 藏经阁 | | 版权所有 ©2008 entlib.net.cn