我们在 Entity Framework 4.1 解决方案中实现了软/逻辑删除。
我在这个答案中部分描述了它:
部分答案
首先,我们向数据库中所有需要软删除或逻辑删除的表添加了 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;
}
}
}