ABP Sqlite 级联删除、ABP EF Sqlite级联删除
前言:
为实现在ABP中实现级联删除。
以前参照过ABP工作单元实现过一套符合公司业务要求的工作单元。
1. 如何实现ABP EF Sqlite 级联删除?
参考链接地址 https://stackoverflow.com/questions/5890250/on-delete-cascade-in-sqlite3
sqlite 默认是没有启用外键的,需要每次连接数据库时,执行 “PRAGMA foreign_keys = ON”命令。
而ABP中使用 仓储服务“IRepository”时,DBContext 已经帮我们创建好了。
那么现在的问题就是 如何在DBContext创建好之后,立即执行 “PRAGMA foreign_keys = ON”命令,这就从程序的角度上实现了Sqlite的级联删除。
2. ABP Vnext中DBContext由如何创建?
快速查找(我使用的是 Resharper ,F12 Resharper自动下载的相关源代码)
查看源代码
这里使用的EF,选EFCore仓储这实现
在这个 EfCoreRepository 文件中找到 谁创建的DBContext
查看 IDbContextProvider 默认实现是 UnitOfWorkDbContextProvider,如下图,找到了。“GetDbContextAsync”方法创建的DBContext,接下来重构这个方法,当DBContext创建完成后,立即执行“RAGMA foreign_keys = ON”sql命令
3. 重写 GetDbContextAsync 方法
思路:创建一个新类,继承 UnitOfWorkDbContextProvider ,然后重写 GetDbContextAsync 方法 ,再然后替换服务中注册的 IDbContextProvider 的实现类
代码如下:
查看代码
public class xxxxxxfdsafdas<TDbContext> : UnitOfWorkDbContextProvider<TDbContext>
where TDbContext : IEfCoreDbContext
{
public xxxxxxfdsafdas(IUnitOfWorkManager unitOfWorkManager,
IConnectionStringResolver connectionStringResolver,
ICancellationTokenProvider cancellationTokenProvider,
ICurrentTenant currentTenant,
IEfCoreDbContextTypeProvider efCoreDbContextTypeProvider)
: base(unitOfWorkManager, connectionStringResolver, cancellationTokenProvider, currentTenant, efCoreDbContextTypeProvider)
{
}
public override async Task<TDbContext> GetDbContextAsync()
{
var dbContext = await base.GetDbContextAsync();
var sql = FormattableStringFactory.Create("PRAGMA foreign_keys = ON");
await dbContext.Database.ExecuteSqlAsync(sql);
return dbContext;
}
}
类名称自己写一个,我这里随便写下
服务替换
context.Services.Replace(new ServiceDescriptor(typeof(IDbContextProvider<>),
typeof(xxxxxxfdsafdas<>), ServiceLifetime.Transient));
OK,搞定
本文作者:youliCC