2

我试图防止对我的数据库表进行任何删除。目前使用 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(这是我所有数据库中的(位)列表)值为假。目前,我迷失在互联网上的文档和共享代码中。

谢谢

4

2 回答 2

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 的实体的查询过滤掉那些被软删除的实体。

于 2014-09-23T11:02:08.663 回答
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();
    }
于 2016-02-03T11:38:01.743 回答