文章目录

  • 前言
  • 一、数据库连接配置
    • 1.安装对应的包
    • 2.进行数据库配置
    • 3.使用数据库

前言

连接数据库是任何应用必不可少的,是用户和数据库交互的必经之路。

数据库连接是客户端连接数据库服务器的通道,客户端通过连接来操作数据库和接受数据库返回的结果集。

数据库连接池作用

  • 限定数据库的个数,不会导致由于数据库连接过多导致系统运行缓慢或崩溃
  • 数据库连接不需要每次都去创建或销毁,节约了资源
  • 数据库连接不需要每次都去创建,响应时间更快。

一、数据库连接配置

1.安装对应的包

Pomelo.EntityFrameworkCore.MySql
Npgsql.EntityFrameworkCore.PostgreSQL
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore
Microsoft.Data.SqlClient

2.进行数据库配置

DbContext的两个添加方式:

  • DbContext:不是线程安全的.因此,您无法将同一DbContext对象同时用于多个查询(奇怪的事情会发生).通常的解决方案是每次需要一个新的DbContext对象.这就是AddDbContext的作用。
  • DbContextPool:重用DbContext对象没有任何问题.这就是AddDbContextPool所做的,它使多个DbContext对象保持活动状态,并为您提供了一个未使用的对象,而不是每次都创建一个新对象。

1、注入

#region 数据库连接
var Mysql_connection = configuration.GetConnectionString("MySqlConn");
var SqlLite_connection = configuration.GetConnectionString("SqlLiteConn");
var SqlServer_connection = configuration.GetConnectionString("SqlServerConn");
var Postgre_connection = configuration.GetConnectionString("PostGresConn");
var database_config = configuration.GetSection("Database")["db"];
services.AddDbContextPool<SqlDBContext>(t =>
{if (database_config == "SqlLite"){t.UseSqlite(SqlLite_connection, b => b.MigrationsAssembly("ModernWMS"));}else if (database_config == "MySql"){t.UseMySql(Mysql_connection, new MySqlServerVersion(new Version(8, 0, 26)));}else if (database_config == "SqlServer"){t.UseSqlServer(SqlServer_connection);}else if (database_config == "PostGres"){t.UseNpgsql(Postgre_connection);AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);}//启用敏感数据记录t.EnableSensitiveDataLogging();//启用日志工厂,会打印在控制台t.UseLoggerFactory(new LoggerFactory(new[] { new DebugLoggerProvider() }));
}, 100);
#endregion

2、SqlDBContext

主要是配置继承BaseModel基础类Model和数据库的映射
数据库迁移的两个方法:

  • EnsureCreated:EnsureCreated可以直接使用,不需要额外的配置,但无法进行代码更新数据库。
  • Migration:通过使用Add-Migration在项目中创建迁移代码,然后才可以使用,Migration执行会在目标数据库中创建__EFMigrationsHistory表,用来记录更新过程,当数据库发生变化后,可以进行更新。
/// <summary>
/// SqlDBContext
/// </summary>
public class SqlDBContext : DbContext
{/// <summary>///  current user's tenant_id/// </summary>public byte tenant_id { get; set; } = 1;/// <summary>/// Database/// </summary>/// <returns></returns>public DatabaseFacade GetDatabase() => Database;/// <summary>/// s/// </summary>/// <param name="options">options</param>public SqlDBContext(DbContextOptions options) : base(options){}#region overwrite/// <summary>/// Auto Mapping Entity/// </summary>/// <param name="modelBuilder">ModelBuilder</param>private void MappingEntityTypes(ModelBuilder modelBuilder){var baseType = typeof(Models.BaseModel);var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;var referencedAssemblies = System.IO.Directory.GetFiles(path, $"ModernWMS*.dll").Select(Assembly.LoadFrom).ToArray();var list = referencedAssemblies.SelectMany(a => a.DefinedTypes).Select(type => type.AsType()).Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToList();if (list != null && list.Any()){list.ForEach(t =>{var entityType = modelBuilder.Model.FindEntityType(t);if (entityType == null){modelBuilder.Model.AddEntityType(t);}});}}/// <summary>/// overwrite OnModelCreating/// </summary>/// <param name="modelBuilder"></param>protected override void OnModelCreating(ModelBuilder modelBuilder){MappingEntityTypes(modelBuilder);
/*            foreach (var entityType in modelBuilder.Model.GetEntityTypes()){if (typeof(Models.IHasTenant).IsAssignableFrom(entityType.ClrType)){ConfigureGlobalFiltersMethodInfo.MakeGenericMethod(entityType.ClrType).Invoke(this, new object[] { modelBuilder });}}*/base.OnModelCreating(modelBuilder);}/// <summary>/// 获取表的实体/// </summary>/// <typeparam name="T">实体</typeparam>/// <returns></returns>public virtual DbSet<T> GetDbSet<T>() where T : class{if (Model.FindEntityType(typeof(T)) != null){return Set<T>();}else{throw new Exception($"type {typeof(T).Name} is not add into DbContext ");}}/// <summary>/// 创建整个数据库,但不会进行Migration更新数据库,因为没__EFMigrationsHistory表/// </summary>/// <returns></returns>public virtual bool EnsureCreated(){return Database.EnsureCreated();}/// <summary>/// 重写配置文件/// </summary>/// <param name="optionsBuilder"></param>protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){base.OnConfiguring(optionsBuilder);}#endregion
}

3.使用数据库


/// <summary>
/// The DBContext
/// </summary>
private readonly SqlDBContext _dBContext;/// <summary>
/// Localizer Service
/// </summary>
private readonly IStringLocalizer<ModernWMS.Core.MultiLanguage> _stringLocalizer;/// <summary>
///User  constructor
/// </summary>
/// <param name="dBContext">The DBContext</param>
/// <param name="stringLocalizer">Localizer</param>
public UserService(SqlDBContext dBContext, IStringLocalizer<ModernWMS.Core.MultiLanguage> stringLocalizer)
{this._dBContext = dBContext;this._stringLocalizer = stringLocalizer;
}/// <summary>
/// get select items
/// </summary>
/// <param name="currentUser">current user</param>
/// <returns></returns>
public async Task<List<FormSelectItem>> GetSelectItemsAsnyc(CurrentUser currentUser)
{var res = new List<FormSelectItem>();var userrole_DBSet = _dBContext.GetDbSet<UserroleEntity>();res.AddRange(await (from ur in userrole_DBSet.AsNoTracking()where ur.is_valid == true && ur.tenant_id == currentUser.tenant_idselect new FormSelectItem{code = "user_role",name = ur.role_name,value = ur.id.ToString(),comments = "user's role",}).ToListAsync());return res;
}

【愚公系列】2023年02月 WMS智能仓储系统-005.数据库连接配置相关推荐

  1. 【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计

    文章目录 前言 一.数据库文档设计 1.chm版本 2.PDF版本 3.html版本 二.数据库表目录 表结构 __EFMigrationsHistory asn asnsort category c ...

  2. 【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)

    文章目录 前言 一.收获管理和发货管理 1.收获管理 1.1 页面代码 1.2 接口代码 2.发货管理 1.1 页面代码 1.2 接口代码 前言 WMS智能仓储收货管理和发货管理是非常重要的两个功能 ...

  3. 【愚公系列】2023年02月 WMS智能仓储系统-007.Swagger接口文档的配置

    文章目录 前言 一.Swagger接口文档的配置 1.安装包 2.注入 2.1 Swagger服务的注入 2.2 appsetting.json的配置 2.3 Swagger服务的封装 2.3.1 S ...

  4. 【愚公系列】2023年02月 WMS智能仓储系统-017.仓内作业(库存冻结、库存调整、库存盘点)

    文章目录 前言 一.仓内作业 1.库存冻结 1.1 页面代码 1.2 接口代码 2.库存调整 2.1 页面代码 2.2 接口代码 3.库存盘点 3.1 页面代码 3.2 接口代码 前言 这节主要分为两 ...

  5. 【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)

    文章目录 前言 一.库存管理 1.1 页面代码 1.2 接口代码 二.仓内作业 1.仓内加工 1.1 页面代码 1.2 接口代码 2.库存移动 2.1 页面代码 2.2 接口代码 前言 这节主要分为两 ...

  6. 【愚公系列】2023年02月 WMS智能仓储系统-010.全局过滤、中间件、格式化配置

    文章目录 前言 一.全局过滤 1.全局行为过滤的概念 2.全局行为过滤的注册方式 2.1 方法注册 2.2 控制器注册 2.3 全局注册 2.4 TypeFilter 和 ServiceFilter ...

  7. 【愚公系列】2023年02月 WMS智能仓储系统-001.NLog日志的使用

    文章目录 前言 一.NLog日志的使用 1.安装包 2.配置文件nlog.config 3.使用 前言 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...

  8. 【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现

    文章目录 前言 1.业务流程说明 2.登录业务的相关技术点 3.登录-token原理分析 4.前端框架设计 一.登录功能的实现 1.登录页面设计 2.登录逻辑功能实现 2.1 登录逻辑页面 2.2 接 ...

  9. 【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)

    文章目录 前言 一.基础设置 1.货主信息 1.1 页面代码 1.2 接口代码 2.运费设置 2.1 页面代码 2.2 接口代码 3.客户信息 3.1 页面代码 3.2 接口代码 前言 基础设置主要分 ...

最新文章

  1. PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
  2. 关于Canvas的一些经验
  3. WebView 上传文件 WebChromeClient之openFileChooser函数
  4. 对Dev的GridControl/GridView控件进行分组并展开操作
  5. 抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
  6. SAP 库存关联表信息
  7. 《openssl编程》之BIO
  8. ORA-28000: the account is locked
  9. 1108D. Diverse Garland
  10. STM32的ADC通道间干扰的问题
  11. js基本函数和基本方法
  12. sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议
  13. Visual C#中用WMI控制远程计算机
  14. Android 颜色渲染(三) Shader颜色渲染
  15. 【Gym-101775 J】Straight Master【差分、贪心】
  16. 关于计算机的病毒案例分析,实例解析蠕虫病毒的原理 -电脑资料
  17. 浅谈视频会议系统的带宽控制!
  18. 硬盘换个计算机怎么启动,更换硬盘后,从U盘启动安装win7的13步方法
  19. 35岁的网络工程师入行需要注意什么?
  20. oracle 建分区索引_Oracle分区索引

热门文章

  1. 乌拉姆数列 Euler167
  2. mysql查询persons表中是否存在_Sql语句的一些事(一)
  3. QQ中奖了!我的受骗历程……
  4. Django管理后台
  5. Redis面试题总结(超详细)
  6. 通用开放式架构(GOA)
  7. java需要圣魔才能安装_eclipse java怎么运行?如何使用Eclipse编写运行Java程序
  8. 条形码、二维码的生成与扫描、解析本地二维码
  9. 轩辕剑天之痕游戏java,轩辕剑之天之痕手游
  10. debug控制台的console控台不见了