【问题标题】:How to delete tenant completely?如何彻底删除租户?
【发布时间】:2018-02-28 00:30:04
【问题描述】:

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

我的目标是删除数据库中所有对租户的所有引用。我知道租户是软删除,但由于我不希望我的数据库充满旧的无意义数据,所以我尝试禁用软删除过滤器。

这是我尝试过的一些代码:

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 的情况下都试过了。

但它根本不会从数据库中删除。我没有收到任何错误或异常。

为什么它没有被删除?我怎样才能删除它?肯定有可能吗?

【问题讨论】:

  • 检查perms是否为空。
  • 对不起,我一直很忙。我会在星期天看看这个,然后告诉你。

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


【解决方案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&lt;Setting, long&gt; 而不是IRepository&lt;Setting&gt;

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

来自Data Filters上的文档:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-31
    • 2021-10-01
    • 2015-08-29
    • 1970-01-01
    • 2017-12-24
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多