【问题标题】:How to Soft Delete with Entity Data Model如何使用实体数据模型软删除
【发布时间】:2012-09-20 03:03:32
【问题描述】:

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

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

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

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

但是,虽然我想对删除函数使用修改函数映射,但程序给了我错误,试图在 SaveChanges() 方法上查找插入和更新函数。

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

如果没有,还有其他方法可以实现吗?附:我阅读了有关使用而不是删除触发器的信息。但是,如果可能的话,我想避免它,因为我们正在为移动应用程序开发程序,触发器可能会减慢应用程序的速度。

提前感谢您!

【问题讨论】:

  • IsDeleted 是数据库列,还是只是一个应用概念?
  • 它们是数据库列。但是,我没有将它们映射到实体数据模型中的实体属性,而是将它们用于 EDM 中每个实体中的条件映射,以过滤掉已删除的项目。谢谢
  • 相关主题在这里。 stackoverflow.com/questions/7430286/… Ladislav 在这里谈论修改函数映射。这就是我遇到的麻烦。任何帮助都会很棒。谢谢!

标签: wpf entity-framework triggers


【解决方案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 上创建您自己的保存方法,这就是我们所做的,或者在 Context.OnSavingChanges 事件中。

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

要进行逻辑删除,您需要捕获所有具有已删除 EntityState 的状态条目,将其状态更改为已修改,并设置您的标志。从接口实现可以很容易地对任何需要它的实体进行完全删除。

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;
                    }
                 }

}

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多