如何完全删除租户?

时间:2018-02-27 14:37:41

标签: asp.net-mvc multi-tenant aspnetboilerplate

我正在开发多租户应用程序,并且希望选择删除租户。然而,这似乎不像人们想象的那么简单。

我的目标是删除数据库中所有租户的所有引用。我知道Tenant是Soft-Delete,但是我不想让我的数据库填满旧的无意义数据我试过禁用软删除过滤器。

以下是我尝试过的一些代码:

using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.SoftDelete))
{
    await TenantRepository.DeleteAsync(x => x.Id == tenantId);
}

这不起作用。租户被标记为" IsDeleted"但没有删除。 然后我想,也许它与UnitOfWork有关,所以我确保没有UnitOfWork处于活动状态,然后手动控制它:

using (var unitOfWork = _unitOfWorkManager.Begin())
{
    // the codeblock above went here
    unitOfWork.Complete();
}

这不起作用,结果相同。这只是AbpTenant表。我也试图从所有其他表中删除。例如AbpSettings和AbpLanguages。我根本不清楚如何做到这一点 - "经理"不包含任何删除功能。

我尝试为这些实体创建IRepository,但它不起作用。错误读取

  

类型Abo.Configuration.Setting不能用作泛型类型或方法IRepository中的类型参数TEntity。没有从Abp.Configuration.Setting到Abo.Domain.Entities.IEntity的隐式引用转换。

这让我可以选择直接使用DataContext:

using (EntityFramework.MyDbContext db = new  EntityFramework.MyDbContext())
{
    List<PermissionSetting> perms = await db.Permissions.Where(x => x.TenantId == tenantId).ToListAsync();

    for (int i=0; i<perms.Count(); i++)
    {
        db.Permissions.Remove(perms[i]);
    }

    // I also tried deleting them in bulk at first 
    // ((DbSet<PermissionSetting>)db.Permissions).RemoveRange(db.Permissions.Where(x => x.TenantId == tenantId));

    await db.SaveChangesAsync();
}

我尝试使用和不使用UnitOfWork。

但它不会从数据库中删除。我没有错误或例外。

为什么不删除?我该如何删除它?肯定有可能吗?

1 个答案:

答案 0 :(得分:1)

  

因为我不希望我的数据库填满旧的无意义数据我尝试禁用软删除过滤器。

关于Disable SoftDelete for AbpUserRole的问题:

protected override void CancelDeletionForSoftDelete(EntityEntry entry)
{
    if (IsSoftDeleteFilterEnabled)
    {
        base.CancelDeletionForSoftDelete(entry);
    }
}
  

类型Abo.Configuration.Setting不能用作泛型类型或方法IRepository中的类型参数TEntity。没有从Abp.Configuration.Setting到Abo.Domain.Entities.IEntity的隐式引用转换。

注入IRepository<Setting, long>而不是IRepository<Setting>

  

这让我可以选择直接使用DataContext   ...   但它根本不会从数据库中删除。我没有错误或例外。

来自Data Filters的文档:

using (_unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant))
{
    using (var db = new ...)
    {
        // ...
    }
}

也就是说,没有办法完全删除相关的租户数据。考虑编写SQL。