无法保存ListeItem标记为IsChild True,IsValid True以及所有其他标记需要将子级保存到DB。
任何人都可以建议如何在CSLA中摆脱这个错误。
答案 0 :(得分:2)
如果您有可编辑的子项目的可编辑列表,或者甚至是可编辑业务对象的单个子项,则根级别(父对象)的整个对象图将具有Save()和SaveAsync()方法,假设父级和所有子级没有任何损坏的业务规则(例如缺少必需的属性值),将保存整个对象图。
所以,为了回答你的问题,保存子对象(无论是否是列表的一部分)的方法是调用它的父对象上的Save。请注意,只有具有更改的对象才会实际保存(可能是保存到数据库或XML文件中),因此以这种方式保存子项(即使有数百个兄弟)也非常有效。
那就是说,确实有时你只想在一个子对象上调用Save,这个对象可能在数百个类似对象的列表中。
处理这种情况的最佳方法是,首先创建一个只读列表父对象,它只包含列表中每个子对象所需的最小信息。只读的极小只读子对象列表在代码中的效率远远高于读写可编辑形式的相同列表。
现在,如果列表项需要编辑其数据,则从该选定的只读对象(从父列表)获取表示该对象的唯一ID键(您希望该键成为裸的一部分)加载到列表中每个只读对象的最小数据)。然后使用该键,获取一个完全代表所选子项的设计不同的Editable-Root对象。现在,您可以编辑该独立业务对象上的属性,并在其上调用Save()(或SaveAsync())。在这种情况下,可编辑对象现在是一个独立的根对象。
有效地,此技术允许您仅保存“子”对象。它通常比获取可编辑列表更有效,因为您不太可能需要填充(所有子对象的)所有属性来创建只读列表。只读列表仅用于查找或选择特定对象。选择后,将执行完全可编辑对象的后续提取。
举个例子就是说,你有一个人力资源相关的应用程序,人力资源代表需要更改公司员工的一些信息。在这种情况下,可以创建一个只读的员工列表(或者按员工姓氏的第一个字母过滤的只读列表)。当HR代表选择要编辑的员工时,系统代码将从只读列表中的所选项目中检索需要编辑的员工的唯一标识符。然后使用该键字段,将获取表示单个员工的不同设计的基于EditableRoot的业务对象。现在,代码中的一个实际上是一个可编辑的“子”对象,可以独立于任何父列表或父对象进行保存。我将“child”放在引号中,因为可编辑对象是从EditableRoot基类派生的,虽然它表示基于从初始只读员工列表中选择的员工对象,但根对象本身并不是子对象,但是一个完全可以保存的root员工对象。
我一直在适当的环境中使用这种技术。该技术获取了许多可能需要更改和保存的子对象的轻量级只读和最小表示,并且只有实际变化的那些是稍后作为EditableRoot获取的那些可编辑的属性。
希望这可以帮助使用CSLA.NET的人。