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,搞定

posted @ 2023-08-24 21:45  youliCC  阅读(51)  评论(0编辑  收藏  举报