SqlHelper 使用EF-Core框架 连接池处理并发

news2024/12/27 2:21:34

定义数据库

数据库名称:T_dicomPatientMsg

注意5大约束条件:

1.主键约束:primary key  IDKEY设置为主键,主键设置自增长

2.唯一性约束:unique

3.默认约束:default    所有值都要设置默认值,除了主键

4.检查约束:check

5.外键约束:foreign key

定义实体
 public class DicomPatientMsg
 {
     [Key]
     public int IDKEY { get; set; }        //设为主键,注意实体名称需要与数据库实体名称一致
     public string PatientID { get; set; }
     public string PatientName { get; set; }
     public DateTime PatientBirthDate { get; set; }
     public DateTime CheckDate { get; set; }
     public string PicturePath { get; set; }
     public string DicomFilePath { get; set; }
     public string SOPInstanceUID { get; set; }
     public string StudyID { get; set; }
     public string StudyInstanceUID { get; set; }
     public string SeriesInstanceUID { get; set; }
     public string InstanceNum { get; set; }
     public bool IsDelete { get; set; } 
 }
SQL帮助类

连接池实现并发连接

public class SqlHelper
{
    private readonly AppDbContext _context;

    //构造函数注入DB_context
    public SqlHelper(AppDbContext context)
    {
        _context = context;
    }

    // 增加实体
    public async Task AddAsync<T>(T entity) where T : class
    {
        await _context.Set<T>().AddAsync(entity);
        await _context.SaveChangesAsync();
    }

    // 获取所有实体
    public async Task<List<T>> GetAllAsync<T>() where T : class
    {
        return await _context.Set<T>().ToListAsync();
    }

    // 根据ID获取实体
    public async Task<T> GetByIdAsync<T>(int id) where T : class
    {
        return await _context.Set<T>().FindAsync(id);
    }

    // 更新实体
    public async Task UpdateAsync<T>(T entity) where T : class
    {
        _context.Set<T>().Update(entity);
        await _context.SaveChangesAsync();
    }

    // 删除实体
    public async Task DeleteAsync<T>(T entity, bool isDelete = false) where T : class
    {
        if (isDelete)
        {
            _context.Set<T>().Remove(entity);
        }
        else
        {
            var property = entity.GetType().GetProperty("IsDeleted");
            if (property != null && property.PropertyType == typeof(bool))
            {
                property.SetValue(entity, true);
                _context.Set<T>().Update(entity);
            }
            else
            {
                throw new InvalidOperationException("Error");
            }
        }
        await _context.SaveChangesAsync();
    }
}
 public async Task AddAsync<T>(T entity) where T : class
        {
            await _context.Set<T>().AddAsync(entity);
            await _context.SaveChangesAsync();
        }

//增加实体

public 表面方法是公开的,所有其他类都可以调用

async 表方法内可能包含异步操作,允许方法在内部使用"await"

await 在异步操作中使用,会暂停当前方法的执行(阻塞当前线程),直到方法执行完成后,才会继续执行下面的代码,暂停期间,控制权会返回给调用方(如UI线程)

Task 当一个 方法的返回类型是Task时,表面这个方法是异步的,但它不返回任何值(即它是'void'的异步版本,同理int的异步版本为Task<int>)。通过Task,调用者可以选择是否等待这个方法完成

AddAsync<T>(T entity)  T是泛型类型的参数,它使得这个方法可以处理任意类型的实体对象。T由调用者传入的entity类型所决定。如果不使用泛型,只处理某一实体类型如User,也可以写成AddUserAsync(User entity)

where T : class  约束条件,限制了T必须是一个类

 private readonly AppDbContext _context;

    //构造函数注入DB_context
    public SqlHelper(AppDbContext context)
    {
        _context = context;
    }

这里为什么要用构造函数去注入DbContext

DbContext通常代表数据库的会话(增删改查等),每个DbContext实例都代表与数据库的一次交互。

配置AppDbContext
public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {

    }

    // 定义数据库表
    public DbSet<DicomPatientMsg> T_dicomPatientMsg { get;set;}

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DicomPatientMsg>().HasQueryFilter(e => !e.IsDelete);        //过滤已软删除的记录
    }

}
在appsettings.json配置数据库连接字符串
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "ConnectionStrings": {
    "DefaultConnection": "Server=.\\SQLEXPRESS;Database=Colposcope;User Id=sa;Password=123;TrustServerCertificate=True;"
  },
  "AllowedHosts": "*"
}


//TrustServerCertificate=true  禁用SSL验证
注册DbContext 服务
// 从配置文件读取字符串
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");

// 添加DbContext服务
builder.Services.AddDbContext<AppDbContext>((options) => options.UseSqlServer(connectionString));

//添加SqlHelper,DicomFunc 和控制器类到 DI 容器
builder.Services.AddScoped<SqlHelper>();
builder.Services.AddScoped<DicomFunc>();
使用数据库
private readonly static SqlHelper sqlHelper = SqlHelper.Instance;



DicomPatientMsg msg = new DicomPatientMsg()
{
    DicomFilePath = patientMsg.DicomFilePath,
    PatientID = patientMsg.PatientID,
    PatientName = patientMsg.PatientName,
    CheckDate = checkDate,
    PicturePath = patientMsg.PicturePath,
    SOPInstanceUID = dataset.GetString(DicomTag.SOPInstanceUID),
    StudyID = dataset.GetString(DicomTag.StudyID),
    StudyInstanceUID = dataset.GetString(DicomTag.StudyInstanceUID),
    SeriesInstanceUID = dataset.GetString(DicomTag.SeriesInstanceUID),
    InstanceNum = dataset.GetString(DicomTag.InstanceNumber),
};

//存储到sql
await sqlHelper.AddAsync(msg);

下面理清一下这个数据库的使用流程:

1. 依赖链

 DicomController 依赖 DicomFunc,而 DicomFunc 依赖 SqlHelperSqlHelper 又依赖 AppDbContext

  • DicomController 依赖 DicomFunc
  • DicomFunc 依赖 SqlHelper
  • SqlHelper 依赖 AppDbContext

2. 服务注册

  • AppDbContext 的注册:使用 AddDbContext<AppDbContext> 将数据库上下文注册到 DI 容器中。这允许 SqlHelper 构造函数接收 AppDbContext 实例。
  • SqlHelper 的注册:我们使用 AddScoped<SqlHelper>() 注册 SqlHelper,让 DicomFunc 可以注入它。
  • DicomFunc 的注册:我们注册 DicomFunc,确保 DicomController 能够接收它。

3. 依赖注入的执行

当一个请求到达DicomController时,ASP.NET Core的依赖注入容器会

  1. 实例化 DicomController

    控制器依赖于 DicomFunc,容器会尝试实例化 DicomFunc
  2. 实例化 DicomFunc

    DicomFunc 的构造函数依赖于 SqlHelper,容器会进一步尝试实例化 SqlHelper
  3. 实例化 SqlHelper

    SqlHelper 的构造函数依赖于 AppDbContextAppDbContext 是通过 AddDbContext 方法注册到容器中的,它会被自动提供给 SqlHelper
  4. 实例化 AppDbContext

    容器会从依赖注入容器中提取并实例化 AppDbContext,这可能涉及数据库连接的初始化等操作。
  5. 完成实例化

    • 最终,AppDbContext 实例被注入到 SqlHelper 中。
    • SqlHelper 实例被注入到 DicomFunc 中。
    • DicomFunc 实例被注入到 DicomController 中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unraid 手动安装docker

目录 常用镜像链接一.安装示例1[firefox浏览器]:1.离线下载docker镜像2.将xxx.tar镜像数据加载到 Docker 中3.手动添加docker 二.安装示例2[等我有东西需要安装再回来补教程吧]:三.获取UDI和GID 常用镜像链接 特别版 emby 文件管理器 filebrowser内外穿透 zerotierNAS媒体库管…

Python和Pycharm安装

有需要的私聊我吧&#xff01;&#xff01;&#xff01;

伺服电机最佳速度范围是多少?

伺服电机的最佳速度范围取决于多种因素&#xff0c;包括电机的规格、负载类型、控制要求和应用环境等。一般来说&#xff0c;伺服电机的最佳速度范围是其额定转速的70%到100%之间。这一范围内&#xff0c;电机能够提供最佳的效率、精度和响应速度。 关键因素影响伺服电机速度范…

从B端工程师到AI绘画工程师:我的转行之路与实战指南

一、背景&#xff1a;B端工程师的迷茫与探索 大家好&#xff0c;我是一名有着五年B端服务经验的软件工程师。在长期的B端工作中&#xff0c;我逐渐感到自己的技术栈和视野受限&#xff0c;对未来的职业发展产生了迷茫。在一次偶然的机会中&#xff0c;我接触到了AI绘画这一领域…

nacos 安装

1. 环境准备 使用此快速开始方法进行Nacos安装及部署&#xff0c;需要安装Docker和Docker Compose。 如何下载不下来&#xff0c;可换镜像加速地址 vi /etc/docker/daemon.json {"registry-mirrors": ["https://docker.registry.cyou"] }可用镜像加速地…

合宙Air700EAQ硬件设计手册——应用接口2

Air700EAQ是一款基于移芯EC716E平台设计的LTE Cat 1无线通信模组。 支持亚洲FDD-LTE的4G远距离无线传 输技术。 以极小封装&#xff0c;极高性价比&#xff0c;满足IoT行业的数传应用需求。 例如共享应用场景&#xff0c;定位器场景&#xff0c;DTU数 传场景等。 在上文我们…

E82EV752K4C变频器可议价

E82EV752K4C变频器可议价 E82EV752K4C变频器可议价 E82EV752K4C变频器可议价 E82EV752K4C变频器参数表 E82EV752K4C变频器引脚图 E82EV752K4C变频器线路图 E82EV752K4C变频器节能主要表现在风机、水泵的应用上。风机、泵类负载采用变频调速后&#xff0c;节电率为20%&…

基于Java+SpringBoot+Vue的知识管理系统

基于JavaSpringBootVue的知识管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 哈喽…

AI驱动的Web3革命:如何通过智能技术实现去中心化

在当今的数字世界中&#xff0c;人工智能&#xff08;AI&#xff09;和Web3分别代表了智能技术和去中心化网络的两大潮流。它们的结合不仅展示了科技的无限潜力&#xff0c;还预示着我们即将迎来一个全新的互联网时代。本文将探讨AI如何驱动Web3革命&#xff0c;并实现更加智能…

RFID光触发标签在零售行业的深度应用

零售行业作为现代经济的重要组成部分&#xff0c;面临着诸多挑战和竞争压力&#xff0c;消费者需求的多样化、快速变化的市场趋势以及日益复杂的供应链管理&#xff0c;都对零售商提出了更高的要求&#xff0c;在这样的背景下&#xff0c;寻求创新的技术解决方案以提高运营效率…

CRMEB 多店版移动端商家管理功能-工作台

一、功能说明 工作台页面可查看当日总销售额&#xff0c;当日订单数、支付人数以及当日浏览量。快捷进如待处理事项页面&#xff0c;包含商家管理所有功能页面入口。 二、操作流程 1、查看销售额 商家可查看当日总销售额。当日订单数&#xff0c;支付人数以及当日浏览量。点…

TikTok达人的社群经济新生态

在数字化时代&#xff0c;TikTok达人带货不仅催生了新的社群经济生态&#xff0c;还实现了品牌、达人与消费者之间的共创、共享与共赢。本文Nox聚星将和大家探讨TikTok达人带货如何催生新的社群经济生态&#xff0c;并分析其对品牌成长和消费者满意度的推动作用。 1. 共创&…

PHP多门店民宿酒店预订系统小程序源码

&#x1f3e8;✨「多门店酒店民宿预订系统」——一键解锁全球住宿新体验&#xff01;&#x1f30d;&#x1f3e0; &#x1f31f; 开篇种草&#xff1a;旅行新伙伴&#xff0c;预订无忧&#xff01; 嘿小伙伴们&#xff0c;是不是每次计划旅行都被繁琐的酒店民宿预订搞得头大&…

东方晶源即将亮相IDAS 2024设计自动化产业峰会!

第二届设计自动化产业峰会IDAS 2024&#xff08;Intelligent Design Automation Summit 2024&#xff09;将于2024年9月23日-24日在上海张江科学会堂隆重举行。 东方晶源微电子科技&#xff08;北京&#xff09;股份有限公司将亮相峰会&#xff01;期待与您相聚&#xff0c;与全…

Coze智能体:最长用的5类插件工具集

Coze智能体&#xff1a;最长用的5类插件工具集 前言搜索类 1.必应搜索2. 必应图片搜索3. 头条搜索4. 获取头条新闻5. 抖音视频搜索6. 百度搜索7. 微信搜索8. 知乎热榜搜索工具类 1.中文文本转语音2. 英文文本转语音3. 语音转文字&#xff1a;4. 代码执行器文档类 1. 链接读取2.…

市场风向标美元承压,日元与商品货币走强

美元承压&#xff0c;空头趋势或加速 随着美联储政策前景的逐步明朗&#xff0c;资产管理公司正积极调整策略&#xff0c;预计将在鲍威尔会议后进一步增加美元净空头头寸。COT报告显示&#xff0c;美元净多头已降至六个月低位&#xff0c;显示市场对美元信心减弱。美元指数逼…

每日OJ_牛客_客似云来(简单斐波那契)

目录 牛客_客似云来&#xff08;简单斐波那契&#xff09; 解析代码 牛客_客似云来&#xff08;简单斐波那契&#xff09; 客似云来__牛客网 解析代码 老样子&#xff0c;先准备好斐波那契的数组&#xff0c;然后遍历那一段数组&#xff0c;求出他们的和即可。而第80项斐波那…

使用cephadm工具在ubuntu2004系统中安装ceph 16.2.7指定版本单点集群

文章目录 前言一、环境版本二、准备基础环境1.时间同步、防火墙服务、时区校正2.安装docker服务3.安装lvm服务 三、准备部署工作1.获取cephadm文件2.下载所需镜像 四、进行部署1.开始部署2.建立cephfs 总结 前言 接到开发同事的需求&#xff0c;在物理机上准备一个和甲方一样版…

炸了炸了,LSTM结合Transformer推陈出新,准确度明显提升!

LSTM与Transformer的结合&#xff0c;作为深度学习中的一项创新技术&#xff0c;近年来在学术界和工业界引起了广泛关注。这种混合模型巧妙地融合了LSTM在处理序列数据时的长短期记忆能力与Transformer在捕捉长距离依赖关系方面的优势&#xff0c;从而在文本生成、机器翻译和时…