实体框架5软删除

时间:2014-09-23 10:56:13

标签: c# entity-framework soft-delete

我正在尝试阻止对数据库表的任何删除。目前正在使用Entity Framework 5.首先,这是我的代码,

public override int SaveChanges()
    {
        var Changed = ChangeTracker.Entries();
        if (Changed != null)
        {
            foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted))
            {
                entry.State = EntityState.Unchanged;
            }
        }

        return base.SaveChanges();
    }

我设法以这种方式阻止它。当我使用EF的Remove方法时它不再工作了。但是,我想要实现的是,当我使用给定ID的remove方法时,我想设置isDeleted(这是我所有数据库中的(位)列表)值为false。目前,我迷失在互联网上的文件和共享代码中。

由于

2 个答案:

答案 0 :(得分:7)

我可能会通过使软删除实体实现一个接口来处理这个问题,比如ISoftDeletable。

public interface ISoftDeletable
{
    bool IsDeleted { get; set; }
}

然后扩展上面的代码以检查实体类型是否实现 ISoftDeletable 接口,如果它只是将 IsDeleted 设置为true。

public override int SaveChanges()
    {
        var Changed = ChangeTracker.Entries();
        if (Changed != null)
        {
            foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted))
            {
                entry.State = EntityState.Unchanged;
                if (entry.Entity is ISoftDeletable)
                {
                    // Set IsDeleted....
                }
            }
        }

        return base.SaveChanges();
    }

然后,您需要确保对实现ISoftDeletable的实体的查询过滤掉那些被软删除的实体。

答案 1 :(得分:0)

在@BenjaminPauls的基础上建立了很好的答案,但使用了通用的Entries<TEntity>。在我看来,它清理了代码和雏鸟。

public override int SaveChanges()
{
    foreach (var entry in ChangeTracker.Entries<ISoftDeletable>())
    {
        if (entry.State == EntityState.Deleted)
        {
            // Set deleted.
        }
    }
    return base.SaveChanges();
}

甚至:

    public override int SaveChanges()
    {
        foreach (var entry in ChangeTracker.Entries<ISoftDeletable>()
            .Where(x => x.State == EntityState.Deleted)
        {
            // Set deleted.
        }
        return base.SaveChanges();
    }