如何检查外键来限制软删除?
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 中,您可以在 DbContext
的 ApplyAbpConceptsForDeletedEntity
中编写自己的支票:
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
实际上是在删除之前从角色中移除用户。
我想知道在 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 中,您可以在 DbContext
的 ApplyAbpConceptsForDeletedEntity
中编写自己的支票:
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
实际上是在删除之前从角色中移除用户。