【愚公系列】2023年02月 WMS智能仓储系统-005.数据库连接配置
文章目录
- 前言
- 一、数据库连接配置
- 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.数据库连接配置相关推荐
- 【愚公系列】2023年02月 WMS智能仓储系统-011.数据库文档设计
文章目录 前言 一.数据库文档设计 1.chm版本 2.PDF版本 3.html版本 二.数据库表目录 表结构 __EFMigrationsHistory asn asnsort category c ...
- 【愚公系列】2023年02月 WMS智能仓储系统-018.收获管理和发货管理(完结篇)
文章目录 前言 一.收获管理和发货管理 1.收获管理 1.1 页面代码 1.2 接口代码 2.发货管理 1.1 页面代码 1.2 接口代码 前言 WMS智能仓储收货管理和发货管理是非常重要的两个功能 ...
- 【愚公系列】2023年02月 WMS智能仓储系统-007.Swagger接口文档的配置
文章目录 前言 一.Swagger接口文档的配置 1.安装包 2.注入 2.1 Swagger服务的注入 2.2 appsetting.json的配置 2.3 Swagger服务的封装 2.3.1 S ...
- 【愚公系列】2023年02月 WMS智能仓储系统-017.仓内作业(库存冻结、库存调整、库存盘点)
文章目录 前言 一.仓内作业 1.库存冻结 1.1 页面代码 1.2 接口代码 2.库存调整 2.1 页面代码 2.2 接口代码 3.库存盘点 3.1 页面代码 3.2 接口代码 前言 这节主要分为两 ...
- 【愚公系列】2023年02月 WMS智能仓储系统-016.库存管理和仓内作业(库存管理、仓内加工、库存移动)
文章目录 前言 一.库存管理 1.1 页面代码 1.2 接口代码 二.仓内作业 1.仓内加工 1.1 页面代码 1.2 接口代码 2.库存移动 2.1 页面代码 2.2 接口代码 前言 这节主要分为两 ...
- 【愚公系列】2023年02月 WMS智能仓储系统-010.全局过滤、中间件、格式化配置
文章目录 前言 一.全局过滤 1.全局行为过滤的概念 2.全局行为过滤的注册方式 2.1 方法注册 2.2 控制器注册 2.3 全局注册 2.4 TypeFilter 和 ServiceFilter ...
- 【愚公系列】2023年02月 WMS智能仓储系统-001.NLog日志的使用
文章目录 前言 一.NLog日志的使用 1.安装包 2.配置文件nlog.config 3.使用 前言 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...
- 【愚公系列】2023年02月 WMS智能仓储系统-012.登录功能的实现
文章目录 前言 1.业务流程说明 2.登录业务的相关技术点 3.登录-token原理分析 4.前端框架设计 一.登录功能的实现 1.登录页面设计 2.登录逻辑功能实现 2.1 登录逻辑页面 2.2 接 ...
- 【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)
文章目录 前言 一.基础设置 1.货主信息 1.1 页面代码 1.2 接口代码 2.运费设置 2.1 页面代码 2.2 接口代码 3.客户信息 3.1 页面代码 3.2 接口代码 前言 基础设置主要分 ...
最新文章
- PCL:点云配准1、基础知识:平面3自由度、旋转矩阵精讲
- 关于Canvas的一些经验
- WebView 上传文件 WebChromeClient之openFileChooser函数
- 对Dev的GridControl/GridView控件进行分组并展开操作
- 抛开 Spring 去理解 IOC 思想:原来 IOC 容器这么简单
- SAP 库存关联表信息
- 《openssl编程》之BIO
- ORA-28000: the account is locked
- 1108D. Diverse Garland
- STM32的ADC通道间干扰的问题
- js基本函数和基本方法
- sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议
- Visual C#中用WMI控制远程计算机
- Android 颜色渲染(三) Shader颜色渲染
- 【Gym-101775 J】Straight Master【差分、贪心】
- 关于计算机的病毒案例分析,实例解析蠕虫病毒的原理 -电脑资料
- 浅谈视频会议系统的带宽控制!
- 硬盘换个计算机怎么启动,更换硬盘后,从U盘启动安装win7的13步方法
- 35岁的网络工程师入行需要注意什么?
- oracle 建分区索引_Oracle分区索引