实体框架:全局禁用删除



我们正在启动一个新的应用程序。我们想使用实体框架。我们几乎不怕意外删除sql行(尤其是意外设置相关数据等)

我想禁用每次删除,因为我们只是用"validUntil"列标记每一行,并且从不删除行。

我看到它可以在 sql 中通过角色来完成,但我希望所有的逻辑和控制都只在代码中。

也许在实体框架核心中有新功能可以启用它?我知道它仍然可以使用 EF 编写行 sql,但我们不怕这种情况。

我还尝试删除实体关系的 setter 以使其更加轻松,但它破坏了 EF 的正常功能,并且看起来不是一个好主意。

我在上面的链接中看到使用存储库模式的建议,但这里看起来这不是好的做法。

如何安全地使用 EF?谢谢!

角色选项是一种方式,但您也可以覆盖 SaveChanges。

public override int SaveChanges()
{
    foreach (DbEntityEntry entity in this.ChangeTracker.Entries)
    {
        if (entity.State == System.Data.EntityState.Deleted)
            return;        
    }
    base.SaveChanges();
}

编辑

我在 git 上读到了 EF Core 的内容:

如果要更改所有关系的删除行为,则 您可以在 OnModelCreateating(...) 中使用此代码为所有人批量设置它 模型中的关系。

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
    relationship.DeleteBehavior = DeleteBehavior.Restrict;
}

威廉的回答几乎是这样做的方法,但你也可以做这样的事情。

将"删除

"设置为引发异常,并添加"删除虚拟"方法。主要是这也是更新,您可以通过更新validTil字段来执行所需的软删除。

    T IDbContext.Delete<T>(T entity)
    {
         throw new NotImplementedException();
    }

    T IDbContext.DeleteVirtual<T>(T entity)
    {
        this.Entry(entity).State = EntityState.Modified;
        return entity;
    }
您可以在

类中覆盖SaveChanges()方法DbContext在那里您可以获取已删除实体的列表并将其Status更改为Unchanged

public override int SaveChanges()
{
    var DeletedEntities = ChangeTracker.Entries().Where(E => E.State == EntityState.Deleted).ToList();
    DeletedEntities.ForEach(E => 
    {
        E.State = EntityState.Unchanged;
    });
    return base.SaveChanges();
}

最新更新