如何检查外键来限制软删除?

How to check Foreign Key to restrict SoftDelete?

我想知道在 ASP.NET Boilerplate 中使用 SoftDelete 时是否可以检查 FK。

例子

假设这些表:

Roles: RoleId (PK) - Description
Users: UserId (PK) - Name - RoleId (FK with Roles)

数据:

Roles
1 - admin
2 - guest
Users
1 - admin - 1
2 - john - 2

因此,如果 RoleId 1 已分配给现有的 User,则不应将其删除。

提前致谢。

简而言之,您的目标是 non-sense。 SoftDelete 功能将记录标记为已删除并且不会物理删除它。就像 Windows 中的回收站。这样您就可以随时取消删除它。从数据库的角度来看,它的关系是一致的。因为table里面有数据。

解决方案;当您阻止用户删除 in-use 记录时,您必须根据您的业务规则自行验证它。

软删除只是设置一个标记以将记录标记为已删除。

在 ABP 中,您可以在 DbContextApplyAbpConceptsForDeletedEntity 中编写自己的支票:

public class AbpProjectNameDbContext // : ...
{
    // ...

    protected override void ApplyAbpConceptsForDeletedEntity(EntityEntry entry, long? userId, EntityChangeReport changeReport)
    {
        CheckForeignKeys(entry);

        base.ApplyAbpConceptsForDeletedEntity(entry, userId, changeReport);
    }

    private void CheckForeignKeys(EntityEntry entry)
    {
        var entity = entry.Entity;
        if (!(entity is ISoftDelete))
        {
            // Foreign key constraints checked by database
            return;
        }

        var role = entity as Role;
        if (role != null)
        {
            if (Users.Any(u => u.Roles.Any(r => r.RoleId == role.Id)))
            {
                throw new UserFriendlyException("Cannot delete assigned role!");
            }
        }
    }
}

请注意,模板的 RoleAppService 实际上是在删除之前从角色中移除用户。