【发布时间】:2017-07-29 10:27:19
【问题描述】:
我正在尝试覆盖我的数据库上下文中的 Savechanges 以将我的实体标记为 SoftDeleted。
我有一个 ISoftDeletable 基础,我在我的实体类中覆盖它
public interface IsoftDeletable
{
public bool IsDeleted {get; set;}
}
然后在我的上下文中
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries()
.Where(p => p.State == EntityState.Deleted))
SoftDelete(entry);
return base.SaveChanges();
}
private void SoftDelete(DbEntityEntry entry)
{
var entity = entry.Entity as ISoftDeltable;
entity.IsDeleted = true;
entry.State = EntityState.Modified;
}
如果我删除一个实体,它会被软删除,上面的示例可以正常工作,但问题是,如果该实体具有带级联删除的子集合,则实体框架不会跟踪子集合,并且它们不会被标记为已删除。
一个简单的解决方案是在删除发生之前急切地加载将要删除的实体的所有子集合,以便 Ef 也跟踪子项中的更改并软删除它们,但这是一个“黑客”我想避免。很难记住实体之间的所有关系,并且在删除发生之前急切地加载所有内容。如果模型发生变化,也很难维护。
有没有更好的方法来实现这种功能?
编辑 1:我看不出这个问题如何与 this 重复
【问题讨论】:
-
您可以使用反射来查看存在哪些导航属性,并查看它们是否包含外键,谁与您的键匹配,但这需要进行大量更改,但这仍然比记住所有属性要好手动。您可以通过反射查找表的主键,
-
嗯,是的,这需要进行大量更改,并且会有些混乱。不过我确信有更好的解决方案......
-
Entity Framework soft delete implementation using database interceptor not working 的可能重复项(请检查实现,这可能是您实现此的更好方法,而不是仅挂钩到更改上下文中)
-
我不这样做的原因是我希望能够拥有一个可以清除实体的超级管理员。在更改上下文中,很容易检查身份,如果实体被删除,只需继续执行删除命令。在拦截器中这并不容易
-
相关问题可能有帮助:stackoverflow.com/q/38998535/492
标签: c# entity-framework entity-framework-6