EFCore+Scheme(数据库架构)实现分库分表支持多种主流数据库解决方案|C/S开发框架
EFCore+Scheme(数据库架构)实现分库分表支持多种主流数据库解决方案 目录一、数据库中的Schema含义Schema是数据库的组织和结构,在不同的数据库中,Schema被称为模式、数据库架构等。Schema中包含了schema对象,可以是表(table)、列(column)、数据类型(data type)、视图(view)、存储过程(stored procedures)、关系(relationships)、主键(primary key)、外键(foreign key)等。 Schema的主要作用是用于组织和管理数据库对象,通过Schema可以更加有效地对数据库对象进行分组管理,提高数据库的性能和运行效率。 Oracle数据库中,Schema是一个数据库用户的命名空间,Schema和用户是一一对应的,一个用户对应一个Schema,反之亦然。 达梦数据库中,Schema称为模式,含义与Oracle大致相同。 SqlServer数据库中默认Schema是dbo 二、EFCore为什么使用Schema?EFCore使用Schema的主要原因是为了解决数据库中的命名冲突和逻辑隔离问题。
☛举2个简单例子: 1、如:Oracle数据库的连接字符串,连接服务名 orcl: Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)));User Id=user01;Password=123; 2、如:达梦数据库的连接字符串,默认连接DAMENG库: Server=localhost;Port=5236;Database=DAMENG;Uid=SYSDBA;Pwd=123; 结论:Oracle和达梦数据库的连接字符串都没有连接具体的数据库名称,在这种情况下需要使用Schema来区分不同的数据库,如:CSFrameworkV6_Normal、CSFrameworkV6_System两个数据库。 三、DbContext上下文OnModelCreating方法介绍OnModelCreating是DbContext类的一个方法,用于配置数据库模型。在这个方法中,你可以使用Fluent API来配置每个实体的映射关系、属性类型和其他设置。 C# 全选
四、为什么DbContext.OnModelCreating方法只执行一次?在Entity Framework Core (EFCore)中,DbContext的OnModelCreating方法仅在数据库上下文的生命周期中执行一次。 因为EFCore基于性能优化,在第一次访问数据库时解析模型,并为模型创建一个数据库架构然后缓存起来,当你下次访问数据库时,EFCore会检查缓存的模型是否与当前模型相同,如果相同,它就不会再次调用OnModelCreating方法。 综上所述,不同数据库使用Schema来区分数据库或表(如:Oracle,达梦数据库),并且EFCore的DbContext.OnModelCreating方法只会执行一次,我们在设计分库分表、支持多种主流数据库程序的时候,实例化DbContext会发生实体模型的Schema混乱,导致严重错误。最常见的错误是DbContext找不到表或视图,因为表属于不同的数据库或Schema。 五、解决方案1、实体模型设置Schema在Entity Framework Core (EFCore) 中,有两种方式给实体模型设置Schema: a) 实体类的属性上使用特性 [Table] 来设置 Schema: C# 全选
b) 如果为所有实体设置默认的 Schema,可以在 OnModelCreating 方法中配置 C# 全选
2、解决 DbContext.OnModelCreating方法只执行一次的问题出于性能考虑,DbContext中的OnModelCreating在缺省状态下,只在第一次实例化DbContext时执行,执行后的结果被放在缓存中,供以后的实例使用。然而,在有些情况下,DbContext需要根据调用的场景发生变化,需要重新执行OnModelCreating,这种情况下,需要编写自定义的缓存服务替换默认缓存服务,新的缓存服务根据DbContext的变化确定缓存的键值,如果缓存中没有相应的对象就重新执行OnModelCreating,生成相应的对象保存在缓存中。 编写自定义的ModelCacheFactory工厂,实现IModelCacheKeyFactory接口: C# 全选
编写自定义的缓存服务替换默认的缓存服务: C# 全选
使用自定义ModelCacheFactory工厂方式,实体模型的[Table]特性不需要指定Schema。 六、其他参考资料1、ModelBuilder.HasDefaultSchema方法详解modelBuilder.HasDefaultSchema(string? schema) 方法用于设置默认的数据库架构。 在 Entity Framework Core 中,使用 modelBuilder.HasDefaultSchema 方法来指定默认的数据库架构,我们在定义实体模型时如果没有指定Schema,那么 Entity Framework Core 会自动使用你设置的默认架构。 给实体模型指定Schema,参考: C# 全选
如果您的软件项目使用分库分表,或者采用多种数据库的情况下,实体模型不能指定Schema,参考: C# 全选
反编译查看方法定义: C# 全选
七、CSFramework.EF数据库框架应用Schema测试多种数据库1、CSFramework.EF测试CSFramework.EF数据库框架应用Schema测试多种数据库(.NET8+EFCore) 测试报告:https://www.cscode.net/archive/newdoc/612063008661509.html 2、CSFramework.EF介绍CSFramework.EF是轻量级数据库底层框架,基于Entity Framework 实体框架强大功能封装而成。支持三种主流数据库,分别是SqlServer、Oracle、MySQL,支持国产数据库 - 达梦数据库,用户可扩展其他数据如 PostgreSQL,MongoDB,SQLLite等。 CSFramework.EF数据库框架提供IDatabase接口,里面定义了一组通用的接口方法,如增、删、改、查:Add<T>, Update<T>,Remove<T>,GetQuaryable<T>,支持LINQ,SQL脚本查询和操作,支持常用事务、BulkInsert批量插入等功能。 软件介绍:https://www.cscode.net/archive/csframework.ef/363596745297925.html 扫一扫加作者微信
参考文档:
CSFramework.EF数据库框架应用Schema测试多种数据库(.NET8+EFCore)|C/S开发框架 C/S架构软件开发平台 | 旗舰版V6.0 | 自动备份数据库计划|C/S开发框架 使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架 EFCore+.NET8:使用Oracle数据库提交大图片文件需要指定BLOB类型|C/S开发框架 Oracle:EFCore使用OracleBulkCopy实现批量导入数据|C/S开发框架 C# Win服务定时作业实现集团之间的跨系统跨数据库数据同步|C/S开发框架 C# C/S架构软件自动升级程序Winform+多数据库(MySQL,MsSQL,Oracle)-C/S开发框架 达梦数据库.NETCore.NET8实践指南|C/S软件开发框架|C/S开发框架 MySql数据库连接字符串(ConnectionString)配置参数大全|C/S开发框架 CSFramework.DB数据库底层框架 | DbFramework实体模型框架|C/S开发框架 2022年最新数据:中国国家省市区行政区域数据库下载(Excel/SQLLite)|C/S开发框架 CSFramework.WebApi支持多种常用数据库(Mssql/MySQL/Oracle)|C/S开发框架 无法升级数据库"CSFramework_WebAPITest",因为它是只读的,它具有只读文件,或是用户无权修改其中的某些文件|C/S开发框架 SQL获取数据库中所有用户自定义存储过程、函数、触发器|C/S开发框架 SQL通过附加数据库方式新建用户账套-喜鹊软件OMS系统-C/S开发框架
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 | |