首页 > 数据库 >ABP Sqlite 级联删除、ABP EF Sqlite级联删除

ABP Sqlite 级联删除、ABP EF Sqlite级联删除

时间:2023-08-24 21:56:10浏览次数:46  
标签:GetDbContextAsync Sqlite 级联 删除 DBContext ABP

前言:

  为实现在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,搞定

标签:GetDbContextAsync,Sqlite,级联,删除,DBContext,ABP
From: https://www.cnblogs.com/youlicc/p/17653955.html

相关文章

  • 国标视频云服务EasyGBS国标平台与海康4200平台级联后不能播放的问题解决方法
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等......
  • RTSP流媒体服务器EasyNVR视频平台正确级联至EasyNVS平台的教程
    EasyNVS是EasyNVR的云管理平台,可实现内网监控上云,视频汇聚等功能。近期经常有用户咨询EasyNVR如何级联至EasyNVS平台进行云端统计和管理,在今天的文章中,我们来详细介绍一下。1、配置EasyNVS1)运行EasyNVS之前,可以先在easynvs.ini文件中将IP、端口、HTTPS证书及端口、设备接入密码等信......
  • 安防视频监控平台EasyNVR平台启用国标级联的操作步骤来啦!
    安防视频监控汇聚EasyNVR视频集中存储平台,是基于RTSP/Onvif协议的安防视频平台,可支持将接入的视频流进行全平台、全终端分发,分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。为提高用户体验,让用户更加便捷的使用平台功能,本期小编来分享一个如何在EasyNVR平台上......
  • 野火鲁班猫2安装部署.net6,闭坑system.Data.SQlite。
    近期应企业研发需求,做了一个.net6的Linux-arm研发;1、.net6跨平台,必须在发行版ubuntu22.04+版本以上才可以使用,否则需要用到mono技术;(内核与发行版对应关系) 2、安装.net6环境,不能直接suduapt-getinstalldotnet6,此方法安装的版本会导致使用时候异常,正确的方法是: 3、链......
  • Sqlite3:增删改查
    条件介绍1)已存在一个数据库AddressBook.db以及其中的一张表telephone2)telephone表格式:NameTEXTNOTNULLPhoneNumCHAR(11)NOTNULLBirthdayTEXTNationTEXTDEFAULT'China'insert目的:新增两行记录#include<stdio.h>#include<string.h>#include<......
  • sqlite 实现分页排序
    版本号MacOSAppleM1|Jdk17|Maven3.8.5|SpringBoot2.6.9|内嵌式Sqlite3.42.0.0Pageable使用方式findAll()importorg.springframework.data.domain.Page;importorg.springframework.data.domain.PageRequest;importorg.springframework.data.domain.Pageabl......
  • Springboot 内嵌 Sqlite 配置使用
    版本号MacOSAppleM1|Jdk17|Maven3.8.5|SpringBoot2.6.9|Sqlite3.42.0.0pom.xml<dependencies><dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId>......
  • abp-vnext-pro 实战(八,聚合根的写法,客户M:N地址)
    参考数据字典模块的写法///<summary>///地址///</summary>publicclassAddress:FullAuditedAggregateRoot<Guid>,IMultiTenant{publicGuid?TenantId{get;protectedset;}///<summary>///公司名///</summary>p......
  • peewee 操作 sqlite 锁表问题分析
    在使用pythonorm框架peewee操作数据库时时常会抛出以一个异常,具体的报错就是databaseislocked初步了解是因为sqlite锁的颗粒度比较大,是库锁。当一个连接在写数据库时,另一个连接在想要写任意一张表都会报错。为了解决这个问题,做如下的实验分析问题理论分析SQLite是一......
  • unable to open database file , EF生成SQLite数据库
    前言:  记录下,忘了再回头看看。unabletoopendatabasefile 错误  如果使用EF生成SQLite数据库,发现报出错误unabletoopendatabasefile,请检查下“存放SQLite数据文件的文件夹是否存在”......