[NewLife.XCode]反向工程(自动建表建库大杀器)

NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。

开源地址:https://github.com/NewLifeX/X (求star, 656+)

 

回到目录

大杀器

反向工程是XCode的大杀器,区别于其它ORM的最强功能!

通俗理解:基于XCode开发的应用,无需数据库安装脚本,连接字符串指向哪一台哪一种数据库,系统就自动在上面建库建表!

正式定义:基于实体类的表结构信息,在连接字符串指定的目标数据库上自动执行建库建表、添删改字段、创建索引等操作,支持各种数据库!

应用系统首次启动完成的时候,也是自动建表建库并初始化完成的时候。

反向工程是XCode数万级分表的主要倚仗!

 

创建控制台项目,从Nuget引用NewLife.XCode

创建实体类,模型如下(可参考前面几章来生成实体类):

640?wx_fmt=png

 测试代码:

640?wx_fmt=png

 执行日志:640?wx_fmt=png

自始至终,我们没有编写SQL脚本,没有去数据库创建数据表。

代码写完就跑起来,测试通过就部署到正式库。

从日志来看,程序自动下载SQLite驱动,因为我们并没有指定实体类使用哪一种数据库,XCode自动给我们配置了SQLite。(上一章连接字符串部分有讲解)

 

加一行代码把数据库指向MySql:

640?wx_fmt=png

 执行日志:

640?wx_fmt=png

同样的首先下载MySql驱动,(当然也可以自己通过nuget引用)。

首次连接数据库时,库名指定School报错,因为根本就不存在这个库。

因此,XCode切换到系统库,开始创建数据库School,并创建数据表和索引。这里完全是MySql语法,不同于上面的SQLite建表语句。

 

感兴趣的同学,还可以试试Oracle和SqlServer等数据库。

 

回到目录

正向工程

正向工程就是从数据库读取表结构信息,生成模型信息。

我们来试试写几行代码读取上面创建的数据表:

640?wx_fmt=png

执行日志:

640?wx_fmt=png

从上面可以看到,读取dal.Tables得到了这个连接的所有表结构信息,输出为Xml时,跟前面用来创建实体类的模型文件极为相似。

其实这就是一个模型文件,只是为了生成实体类的模型文件多增加了几个属性而已。

新生命码神工具XCoder,(https://github.com/NewLifeX/XCoder),其中的数据建模工具,可以导出各种数据库的表结构信息,正是基于dal.Tables来实现。

 

正向工程由3个基本接口构成:

  • IDataTable。数据表接口,dal.Tables就是IDataTable集合,包括名称、描述等

  • IDataColumn。数据列接口,每张数据表有多个数据列,包括名称、类型、长度、描述等

  • IDataIndex。数据索引接口,每张数据表没有或者有多个索引,索引指定包括哪些字段 ,是否唯一

 

回到目录

反向工程

有了IDataTable,我们就可以主动控制数据表结构。

DAL.SetTables(IDataTable[] tables);

这是反向工程高级用法,实际日常工作中用不到,各个实体类加载时,将会逐个连接进行反向工程检查,正是调用该方法。

 

给上面的数据模型,增加一个字段Code和对应索引:

640?wx_fmt=png

跑起来:

640?wx_fmt=png

程序自动为我们添加了字段,以及创建了索引!

前面的几个SHOW,就是XCode的正向工程,取得数据库表结构,然后跟实体类结构对比,不相同时执行反向操作。

 

回到目录

反向工程设置

大家还记得上一章系统设置中提到的Migration吗?

XCode.config和连接字符串中都支持这个设置。

可用设置项如下:

  • Off 关闭,不执行反向工程

  • ReadOnly 只读不执行,异步执行反向工程检查,对比后生成变更DDL写入日志

  • On 打开,仅新建,默认设置。新建表、增加字段、创建索引等可以执行,禁止修改字段长度类型,禁止删除字段,以免造成数据丢失

  • Full 完全,修改删除。除了新建表、增加字段、创建索引外,还可以修改字段长度类型、删除字段等,极其危险,慎用

反向工程设计于2008年,10多年经验表明,默认On最合理,不仅满足开发需要,(随时加字段),还避免了字段改变而导致的数据丢失风险;

 

反向工程如此神奇的功能,你想到了什么高端用法吗?我们将在数万级分表分库章节等你!

 

回到目录

系列教程

NewLife.XCode教程系列[2019版]

  1. 增删改查入门。快速展现用法,代码配置连接字符串

  2. 数据模型文件。建立表格字段和索引,名字以及数据类型规范,推荐字段(时间,用户,IP)

  3. 实体类详解。数据类业务类,泛型基类,接口

  4. 功能设置。连接字符串,调试开关,SQL日志,慢日志,参数化,执行超时。代码与配置文件设置,连接字符串局部设置

  5. 反向工程。自动建立数据库数据表

  6. 数据初始化。InitData写入初始化数据

  7. 高级增删改。重载拦截,自增字段,Valid验证,实体模型(时间,用户,IP)

  8. 脏数据。如何产生,怎么利用

  9. 增量累加。高并发统计

  10. 事务处理。单表和多表,不同连接,多种写法

  11. 扩展属性。多表关联,Map映射

  12. 高级查询。复杂条件,分页,自定义扩展FieldItem,查总记录数,查汇总统计

  13. 数据层缓存。Sql缓存,更新机制

  14. 实体缓存。全表整理缓存,更新机制

  15. 对象缓存。字典缓存,适用用户等数据较多场景。

  16. 百亿级性能。字段精炼,索引完备,合理查询,充分利用缓存

  17. 实体工厂。元数据,通用处理程序

  18. 角色权限。Membership

  19. 导入导出。Xml,Json,二进制,网络或文件

  20. 分表分库。常见拆分逻辑

  21. 高级统计。聚合统计,分组统计

  22. 批量写入。批量插入,批量Upsert,异步保存

  23. 实体队列。写入级缓存,提升性能。

  24. 备份同步。备份数据,恢复数据,同步数据

  25. 数据服务。提供RPC接口服务,远程执行查询,例如SQLite网络版

  26. 大数据分析。ETL抽取,调度计算处理,结果持久化

 


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

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

相关文章

树上启发式合并

文章内容选自OI Wiki 参考博客 内容: 树上启发式合并(dsu on tree)对于某些树上离线问题可以速度大于等于大部分算法且更易于理解和实现的算法。 他是用来解决一类树上询问问题,一般这种问题有两个特征: 只有对子树…

CF1270H Number of Components(线段树)

problem 洛谷链接 solution 定理 若 i<ji<ji<j 且 i,ji,ji,j 联通&#xff0c;则必有 k∈(i,j)k\in(i,j)k∈(i,j) 也与 i,ji,ji,j 联通。 下面给出证明&#xff0c;挺显然的。 若 ai<aja_i<a_jai​<aj​&#xff0c;则一定有 ai<ak∨ak<aja_i<…

tex模板

\documentclass{beamer} \usetheme{Madrid} \usecolortheme{default} \usepackage{ctex} \usefonttheme[math]{serif}\usepackage{graphicx} \graphicspath{{img/},{pics/}} % 图片在img目录\title{} \author{} \institute{} \date{\today} \begin{document}\maketitle\begin{f…

Wexflow:C#中的开源工作流引擎

Wexflow是一个高性能、可扩展、模块化和跨平台的工作流引擎。Wexflow在GitHub&#xff1a;https://github.com/aelassas/Wexflow。Wexflow的目标是在没有用户干预的情况下自动执行重复任务。在Wexflow的帮助下&#xff0c;构建自动化和工作流过程变得简单。Wexflow还有助于使长…

分析数学笔记

文章目录夹逼收敛定理(P45):单调收敛定理(P50):闭区间套定理(P56)&#xff1a;有限覆盖定理(P59)&#xff1a;可数集(P62)&#xff1a;聚点(P62)&#xff1a;聚点原理(P62)&#xff1a;波尔查诺-魏尔斯特拉斯定理(P64)柯西序列&柯西收敛准则(P65)压缩映照原理(P67)上下极限…

ASP.NET Core 沉思录 - Logging 的两种介入方法

ASP.NET Core 中依赖注入是一个很重要的环节。因为几乎所有的对象都是由它创建的&#xff08;相关文章请参见《ASP.NET Core 沉思录 - ServiceProvider 的二度出生》&#xff09;。因此整个日志记录的相关类型也被直接添加到了 IServiceCollection 中。今天我们将介绍各个接口/…

CF936D World of Tank(思维dp)

problem 洛谷链接 solution 有一种 dpdpdp 并不常见。其主要思想大概就是积累后再支出 / 先预支后再填充。 本题就是积累后再支出。显然炮冷却好了后就一直处于可用状态&#xff0c;玩没玩过游戏的都知道一冷却好就打一定不会劣于等一会再打&#xff0c;因为这道题的炮也没…

C# 中的Async 和 Await 的用法详解

众所周知C#提供Async和Await关键字来实现异步编程。在本文中&#xff0c;我们将共同探讨并介绍什么是Async 和 Await&#xff0c;以及如何在C#中使用Async 和 Await。同样本文的内容也大多是翻译的&#xff0c;只不过加上了自己的理解进行了相关知识点的补充&#xff0c;如果你…

AtCoder4515 [AGC030F] Permutation and Minimum(dp)

problem 洛谷链接 solution 一个 AiA_iAi​ 只会影响一个 BiB_iBi​&#xff0c;BiB_iBi​ 之间的决定因素 AAA 是不会有交的。 所以如果相邻两个对同一个 BiB_iBi​ 影响的 A2i,A2i−1A_{2i},A_{2i-1}A2i​,A2i−1​ 都是确定的&#xff0c;那么 BiB_iBi​ 也就确定了。 …

Tree Xor(未完全搞定)

Tree Xor 题意&#xff1a; 一颗有n个点的树&#xff0c;边权给出&#xff0c;第i个节点的权值为Wi&#xff0c;但并不知道Wi&#xff0c;只知道Wi在[Li,Ri]&#xff0c;边权等于两端点的异或值 问W序列有多少可能 题解&#xff1a; 如果我们知道一个点的值&#xff0c;就可…

Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务

本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构&#xff0c;部署的微服务主要包括统一网关&#xff08;使用Ocelot开发&#xff09;、统一认证&#xff08;IdentityServer4&#xff09;、应用服务&#xff08;asp.net core web api&#xff09;&#xff1b;本文不…

AtCoder3950 [AGC022E] Median Replace(DFA + dp)

problem solution 可以从 DFA\text{DFA}DFA 的思想来考虑这道题。 考虑建一个 DFA\text{DFA}DFA 只接受最后可以变成字符串 111 的原串。 因为每次是选择三个 连续/相邻 的位置操作&#xff0c;限制是比较强的&#xff0c;无非有三种情况。 case1 三个全 111&#xff0c;操…

Minimum grid

Minimum grid 题意&#xff1a; 一个n * n的矩阵&#xff0c;有m个位置需要填数&#xff0c;填的数的范围是0<k<1e6,需要满足第i行的最大值是b&#xff0c;第j列的最大值是ci&#xff0c;求一个满足条件的最小代价 n<2e3,m<8e5,k<1e6 题解&#xff1a; 如果…

ASP.NET Core 实战:使用 Docker 容器化部署 ASP.NET Core + MySQL + Nginx

一、前言在之前的文章&#xff08;ASP.NET Core 实战&#xff1a;Linux 小白的 .NET Core 部署之路&#xff09;中&#xff0c;我介绍了如何在 Linux 环境中安装 .NET Core SDK / .NET Core Runtime、Nginx、MySQL&#xff0c;以及如何将我们的 ASP.NET Core MVC 程序部署到 Li…

AtCoder 4169 [ARC100D] Colorful Sequences(dp)

problem 洛谷链接 solution 逆向考虑。ansansans 所有蛋糕中的 aaa 序列出现次数 −-− 在 non−colorfulnon-colorfulnon−colorful 蛋糕中的出现次数。 在所有蛋糕中的出现次数&#xff0c;即 (n−m1)⋅kn−m(n-m1)k^{n-m}(n−m1)⋅kn−m&#xff0c;枚举 aaa 序列开头的…

VS2017 无法连接到Web服务器“IIS Express”终极解决方案

今天日了gou了&#xff0c;一大早打开VS2017的时候出现无法连接到Web服务器“IIS Express”的错误&#xff0c;然后必应了一下&#xff0c;再谷歌了一下找到的解决方法也都千篇一律&#xff0c;奈何都没能解决&#xff0c;最后通过静下心来的思考&#xff0c;尝试解决了问题&am…

CodeForces 1361E James and the Chase(dfs + 结论)

problem 洛谷链接 solution 看到这个 20%20\%20% 的特殊性质&#xff0c;脑海里第一个就想到了随机化算法。已经PTSD了着实上头 如果本题只是随便求一个 interesting\text{interesting}interesting 的点&#xff0c;那就非常简单了。 随机化一个点&#xff0c;检查这个点是…

2021牛客暑期多校训练营4

2021牛客暑期多校训练营4 题号题目知识点ACourseBSample GameCLCSDRebuild TreeETree Xor思维线段树FJust a jokeGProductHConvolutionIInverse PairJAverage

Docker最全教程之使用.NET Core推送钉钉消息(二十)

前言上一篇我们通过实战分享了使用Go推送钉钉消息&#xff0c;由于技痒&#xff0c;笔者现在也编写了一个.NET Core的Demo&#xff0c;作为简单的对照和说明。最后&#xff0c;由于精力有限&#xff0c;笔者希望有兴趣的朋友可以分享下使用CoreRT将.NET Core编译成机器代码这块…

[线性代数学习笔记] 线性递推数列及 Berlekamp-Massey 算法的详细推导过程

线性递推数列 线性递推 对于无限数列 {a0,a1,...}\{a_0,a_1,...\}{a0​,a1​,...} 和有限非空数列 {r0,r1,...,rm−1}\{r_{0},r_1,...,r_{m-1}\}{r0​,r1​,...,rm−1​} 。 若对于任意 m−1≤nm-1\le nm−1≤n &#xff0c;有 ∑i0m−1an−iri0\sum_{i0}^{m-1}a_{n-i}r_i0∑…