当前位置: 首页 > 知识库问答 >
问题:

实体框架:全局禁用删除

伍成仁
2023-03-14

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

我想禁用每一次删除,因为我们只是用“validUntil”列标记每一行,而从不删除行。

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

也许在实体框架核心中有新的特性来支持这一点?我知道它仍然可以用EF编写行sql,但我们并不害怕这种情况。

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

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

如何使用EF安全工作?谢谢

共有3个答案

史洛城
2023-03-14

您可以覆盖DbContext类中的SaveChange()方法,在那里您可以获取已删除实体的列表并将它们的状态更改为未更改

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();
}
江华容
2023-03-14

威廉的答案几乎就是这样,但你也可以这样做。

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

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


    T IDbContext.DeleteVirtual<T>(T entity)
    {
        this.Entry(entity).State = EntityState.Modified;
        return entity;
    }
柯曦
2023-03-14

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

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

    base.SaveChanges();
}

编辑

我在git上读到,对于EF Core:

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

foreach (var relationship in modelBuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
{
    relationship.DeleteBehavior = DeleteBehavior.Restrict;
}
 类似资料:
  • 问题内容: 我正在使用EF 4 STE对附件对象进行建模。该 附件 包含了名称,描述,日期,以及最重要的数据()。为了优化加载,我不想在绝对必要之前(即当用户从客户端单击时)检索Data属性。 为了遵循这种方法,我使用了此处描述的表拆分技术。我将“ 附件” 表分为“ 附件” (“名称”,“描述”,“日期”)和“ AttachmentData” (数据)。在我的EF模型中,这是一对一的关系。一切正常

  • 后来呢: 我从多个并发线程调用这样的代码来运行不同的查询…(在。NET Core3.0控制台应用程序中) 问题: 谢了!

  • 我需要了解全局禁用EF Core 2中级联删除的方法。感谢您的帮助。 在EF 6. x中,我们使用以下代码来禁用和实现上的级联删除:

  • 实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯

  • 问题内容: 我需要在每个用户已经有一个ID作为键的数据库中存储大量用户数据。但是,这些用户全部来自更大的用户池,因此,该ID不会增加并且无法自动生成。我需要能够手动设置ID。 是否有捷径可寻? 问题答案: 我进行了一些测试,这似乎对我在EF 7.0.0 rc1-final上有效: 我的测试代码: (完整的程序代码在这里:http : //pastebin.com/hSs9HZCP) 它可以正确插入

  • 我有2个实体类(表A的实体和表B的实体)。表 A 链接到表 B。因此,实体类具有 B 实体的对象列表,并声明如下图所示。 @OneToMany(mappedBy=“AEntity”,cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)private List items=new ArrayList(); 如果我使用“entityManager.remov