删除永久对象

删除永久对象

  • 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();
    }
}

延迟对象删除

如果XPObjectXPCustomObject用作持久对象的基类,则启用延迟删除。这意味着在删除对象时,XPO不会从底层数据存储中物理删除相应的记录。而是,它将记录标记为已删除。删除其他对象引用的对象时,此技术可避免数据库异常。

默认情况下,除非直接引用标记为已删除的对象,否则永远不会从对象存储中检索它们。删除操作还会删除所有聚合对象(请参见AggregatedAttribute)。

您还可以使用Session.Delete方法删除持久对象。此方法接受一个集合作为参数,并为集合中的每个对象调用XPBaseObject.Delete方法。该Session.PurgeDeletedObjects方法将删除标记为删除的对象,从数据存储的所有相应记录一起。

注意

删除启用了“延迟删除”的对象后,会将其从关联的集合中删除。恢复已删除的对象时,无法自动重新创建关联。此行为是设计使然,因为“延迟删除”功能不是用于对象还原,而是用于克服数据库级别的复杂外索引约束。

立即删除对象

如果XPBaseObject用作持久对象的基类,则启用立即对象删除。在这种情况下,物理上删除与已删除对象相对应的记录。请注意,在删除参与多对多关系的对象时,您将获得异常,因为隐藏的中间对象引用了您的对象。这就是为什么在删除对象之前应清除所有对该对象的引用。

注意

要启用延迟对象删除,请应用Deferred Deletion Attribute

注意

此处描述的功能在“数据交换和操作”中进行了演示。删除持久对象的第XPO教程演示(C:\用户\公共\文件\开发快速演示20. 2 \组件\赢形式\ BIN \ Xpo博览会教程。EXE)。

恢复已删除的对象

持久对象(即XPCustomObjectXPObject后代)不会从数据库中物理删除。而是,这些对象仅标记为已删除。XPO在数据库表中为给定的持久性类创建GCRecord列。删除对象时,会将非空值分配给相应的GCRecord字段值。

本示例演示如何还原已删除的对象。为此,应通过XPBaseObject.SetMemberValue方法将一个nullNothing在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();
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值