删除永久对象
- 2020年8月13日
- 4分钟阅读
该eXpress的持久性对象库支持延迟和即时对象删除。
#删除永久对象
要删除持久对象,请调用XPBaseObject.Delete方法:
public void DeleteByKey(int employeeKey){
using(var uow = new UnitOfWork()){
// Get an object
var employee = uow.GetObjectByKey<Employee>(employeeKey);
// Delete the object
employee.Delete();
// Alternative:
// uow.Delete(employee);
uow.CommitChanges();
}
}
#删除对象集合
若要删除持久对象的集合,请调用Session.Delete(ICollection)方法:
public void DeleteCustomersWithZeroOrders(){
using(var uow = new UnitOfWork()){
// Get a collection of Customers with 0 orders
var customersWithZeroOrders = uow.Query<Customer>().Where(c => c.Orders.Count == 0);
// Delete the collection
uow.Delete(customersWithZeroOrders);
uow.CommitChanges();
}
}
#延迟对象删除
如果XPObject或XPCustomObject用作持久对象的基类,则启用延迟删除。这意味着在删除对象时,XPO不会从底层数据存储中物理删除相应的记录。而是,它将记录标记为已删除。删除其他对象引用的对象时,此技术可避免数据库异常。
默认情况下,除非直接引用标记为已删除的对象,否则永远不会从对象存储中检索它们。删除操作还会删除所有聚合对象(请参见AggregatedAttribute)。
您还可以使用Session.Delete方法删除持久对象。此方法接受一个集合作为参数,并为集合中的每个对象调用XPBaseObject.Delete方法。该Session.PurgeDeletedObjects方法将删除标记为删除的对象,从数据存储的所有相应记录一起。
注意
删除启用了“延迟删除”的对象后,会将其从关联的集合中删除。恢复已删除的对象时,无法自动重新创建关联。此行为是设计使然,因为“延迟删除”功能不是用于对象还原,而是用于克服数据库级别的复杂外索引约束。
#立即删除对象
如果XPBaseObject用作持久对象的基类,则启用立即对象删除。在这种情况下,物理上删除与已删除对象相对应的记录。请注意,在删除参与多对多关系的对象时,您将获得异常,因为隐藏的中间对象引用了您的对象。这就是为什么在删除对象之前应清除所有对该对象的引用。
注意
要启用延迟对象删除,请应用Deferred Deletion Attribute。
注意
此处描述的功能在“数据交换和操作”中进行了演示。删除持久对象的第XPO教程演示(C:\用户\公共\文件\开发快速演示20. 2 \组件\赢形式\ BIN \ Xpo博览会教程。EXE)。
#恢复已删除的对象
持久对象(即XPCustomObject或XPObject后代)不会从数据库中物理删除。而是,这些对象仅标记为已删除。XPO在数据库表中为给定的持久性类创建GCRecord列。删除对象时,会将非空值分配给相应的GCRecord
字段值。
本示例演示如何还原已删除的对象。为此,应通过XPBaseObject.SetMemberValue方法将一个null
(Nothing
在VB.NET中)值分配给相应的GCRecord
字段值。
注意
删除启用了“延迟删除”的对象后,会将其从关联的集合中删除。恢复已删除的对象时,无法自动重新创建关联。此行为是设计使然,因为“延迟删除”功能不是用于对象还原,而是用于克服数据库级别的复杂外索引约束。
using System.Collections;
using DevExpress.Xpo;
private void RestoreDeletedCustomers(Session session) {
// "Customer" is an XPObject descendant
using (NestedUnitOfWork restore = session.BeginNestedUnitOfWork()) {
ICollection delCol = restore.GetObjects(restore.GetClassInfo<Customer>(),
Customer.Fields.GCRecord.IsNotNull(), null, 0, true, true);
if (delCol != null && delCol.Count != 0) {
foreach (Customer cust in delCol) {
cust.SetMemberValue(Customer.Fields.GCRecord.PropertyName, null);
}
restore.CommitChanges();
}
}
}