"Can not directly save a child object"



无法保存标记为iSchild true的ListEitem,Isvalid True,所有其他标志都需要将孩子保存到DB。

任何人都可以建议如何摆脱CSLA中的此错误。

当您具有可编辑的子项目列表,甚至是一个可编辑业务对象的一个孩子时,来自根级别的整个对象图(父对象(将具有保存((和一个将保存整个对象图的saveAsync((方法,假设父母和所有孩子都没有任何损坏的业务规则(例如缺少所需的属性价值(。

因此,要回答您的问题,保存子对象的方法(是否列表中的一部分(是调用保存其父对象。请注意,只有具有更改的对象实际上才能保存(大概是数据库或XML文件(,因此即使有数百个兄弟姐妹,这种方式也很有效。

也就是说,确实有时您只想在一个孩子的对象上拨打一个shave of一个可能位于数百个类似对象的列表中。

处理这种情况的最佳方法,尤其是如果您要与成千上万的孩子对象打交道,则首先创建一个只读列表的父对象,该对象仅包含列表中每个子对象中所需的最小信息。仅读取仅读取的儿童对象的仅读取列表的代码效率要比读取编辑表格的同一列表要高得多。

现在,如果列表项需要编辑其数据,则从所选的只读对象(从父列表中(获取代表该对象的唯一ID密钥(您希望该键是Bare的一部分将最小数据加载到列表中的每个只读对象中(。然后使用该键,获取一个完全代表所选孩子的设计不同的可编辑对象。现在,您可以在该独立业务对象上编辑属性,并在其上调用Save(((((或saveasync(((。现在在这种情况下,可编辑的对象是独立的根对象。

有效地,此技术使您仅保存"孩子"对象。通常,它比获得可编辑列表要高得多,因为您不需要填充(所有子对象(来创建仅读取列表的所有属性。仅读取列表仅用于查找或选择特定对象。选择后,执行了完全可编辑的对象的随后提取。

这样一个例子是,假设您有一个与人力资源相关的应用程序,人力资源代表需要更改公司中有关员工的一些信息。在这种情况下,人们将创建一个只读的员工列表以选择(或者由员工姓氏的首字母遵循的仅读取列表(。当HR Rep选择要编辑的员工时,系统代码将为需要从读取列表中所选项目编辑的员工检索唯一标识符。然后使用该密钥字段,将获取代表单个员工的不同设计的基于编辑的业务对象。现在,在代码中,从本质上讲,它具有可编辑的"儿童"对象,可以独立于任何父列表或父对象保存。我将"孩子"放在引号中,因为可编辑对象是从editableroot base类派生的,虽然它代表了一个基于最初纯员工列表的选择的员工对象,但根对象本身并不是孩子,但是一个完全可保存的根员工对象。

我一直在适当的情况下使用这种技术。该技术获取了可能需要更改和保存的子对象的大量重量重量,只读的儿童对象的表示,只有实际被更改的物品是后来被作为Editableroot获取的。可供编辑的属性。

希望这可以帮助某人使用csla.net。

最新更新