2012-04-26 35 views
1

我有一个带有实体数据模型的WPF应用程序。如何使用实体数据模型进行软删除

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

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

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

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

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

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

预先感谢您!

+0

是一个请将isDeleted数据库列,或者仅仅是一个应用程序的概念? – Tyrsius 2012-04-26 21:05:05

+0

它们是数据库列。但是,我没有将它们映射到实体数据模型中的实体属性,但是我将它们用于EDM中每个实体的条件映射以过滤掉已删除的项目。谢谢 – Chikakow 2012-04-27 13:43:48

+0

相关的主题在这里。 http://stackoverflow.com/questions/7430286/how-do-i-override-deleteobject-in-entity-framework Ladislav在这里讨论修改函数映射。这就是我遇到的麻烦。任何帮助都会很棒。谢谢! – Chikakow 2012-04-27 13:49:44

回答

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

}

相关问题