我们在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;
}
}
}
是一个请将isDeleted数据库列,或者仅仅是一个应用程序的概念? – Tyrsius 2012-04-26 21:05:05
它们是数据库列。但是,我没有将它们映射到实体数据模型中的实体属性,但是我将它们用于EDM中每个实体的条件映射以过滤掉已删除的项目。谢谢 – Chikakow 2012-04-27 13:43:48
相关的主题在这里。 http://stackoverflow.com/questions/7430286/how-do-i-override-deleteobject-in-entity-framework Ladislav在这里讨论修改函数映射。这就是我遇到的麻烦。任何帮助都会很棒。谢谢! – Chikakow 2012-04-27 13:49:44