【发布时间】: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