如何使用实体数据模型进行软删除

时间:2012-04-26 20:48:19

标签: wpf entity-framework triggers

我有一个带有实体数据模型的WPF应用程序。

我想在删除实体时将IsDeleted标志设置为true,而不是从数据库中删除。

我在这里阅读了很多线程,很多线程建议使用条件映射来使用修改函数映射。

我使用条件映射来过滤IsDeleted = true行并且效果很好。

但是,虽然我只想使用修改函数映射来删除函数,但程序会给我错误,尝试在SaveChanges()方法中找到插入和更新函数。

我只为删除功能指定。有没有办法只使用删除修改功能而不是所有插入,更新,删除?

如果没有,还有其他方法可以达到这个目的吗?附:我读到了使用替代删除触发器。但是,如果可能的话,我想避免使用它,因为我们正在为移动应用程序开发程序,触发器可能会降低应用程序的速度。

提前谢谢!

1 个答案:

答案 0 :(得分:1)

我们在Entity Framework 4.1解决方案中实现了软/逻辑删除。

我在这个答案中部分描述了它: Partial Answer

首先,我们向数据库中需要软删除或逻辑删除的所有表添加了一个IsDeleted列。在模板中,我将继承添加到IEnforceLogicalDelete接口

public interface IEnforceLogicalDelete
    {
        global::System.Boolean IsDeleted{ get; set; }
    }

在定义实体的模板中,我们添加了这一行:

if(entity.Properties.Where(p => p.DeclaringType == entity && (p.Name == "IsDeleted")).ToList().Count == 1){#>, IEnforceLogicalDelete<#} 

这在实体从EntityObject继承之后添加了接口。

设置完成后,就可以在Context上创建自己的save方法,这就是我们所做的,或者是在Context.OnSavingChanges事件中。

正如我上面所说,我们创建了自己的方法(SaveChangesWithHistory),我们还将所有更改(插入,更新和删除)记录到历史记录表中。

要执行逻辑删除,您需要捕获EntityState为Deleted的所有状态条目,将其状态更改为Modified,并设置标志。通过界面实现,可以轻松地对需要它的任何实体进行完全删除。

foreach (ObjectStateEntry entry in this.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted | EntityState.Added))
        {

            if (entry.State == EntityState.Deleted)
            {
               if (entry.Entity is IEnforceLogicalDelete)
                    {
                        IEnforceLogicalDelete delete = entry.Entity as IEnforceLogicalDelete;
                        entry.ChangeState(EntityState.Modified);
                        entry.ApplyOriginalValues(delete);
                        delete.IsDeleted = true;
                    }
                 }

}