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

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

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

回到目录

大杀器

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

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

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

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

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

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

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

测试代码:

执行日志:

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

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

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

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

执行日志:

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

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

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

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

回到目录

正向工程

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

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

执行日志:

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

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

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

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

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

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

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

回到目录

反向工程

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

DAL.SetTables(IDataTable[] tables);

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

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

跑起来:

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

前面的几个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抽取,调度计算处理,结果持久化

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

  1. xcode修改时间后就要重新编译_[NewLife.XCode]反向工程(自动建表建库大杀器)

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

  2. Mysql - Mysql的建表建库

    目录 Mysql5.7官方参考文档:MySQL :: MySQL 5.7 Reference Manual SQL语言说明文档: 数据库里存在的包含关系: Mysql建表建库: 1.Mysql如何建库 ...

  3. linux shell脚本执行sql语句建表建库

    linux shell脚本执行sql语句建表建库 1. 创建sql脚本 2. 创建shll脚本 1. 创建sql脚本 创建contract_ddl.sql -- 创建数据库contract_user ...

  4. SQL server数据库手动建库建表建约束,代码建库建表,数据库备份

    目录 一,手动建库 二,sql代码建库 三,手动建表以及建立约束 四,sql代码建表以及建立约束 五,数据库备份 一,手动建库 右键数据库-->新建数据库 填写数据库名称-->确定 如果数 ...

  5. sqlserver建库建表建约束,删库删表删约束的示例总结

    1.创建一个数据库catedb,保存在本地D盘下面的DB中,主数据文件的初始大小为5MB,最大为200MB,增长率为10%,日志文件的初始大小为3MB,无限制增长,其增长率为2MB,请使用sql语句检 ...

  6. SQL Server学习1(建数据库,建表,建约束)

    --建数据库NetBarDB IF exists(select * from sys.sysdatabases where [NAME]='NetBarDB')     drop database N ...

  7. mysql 建表建索引

    Mysql建表与索引使用规范整理 一,设计表规范: MySQL建表,字段需设置为非空,需设置字段默认值: MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL: MySQL建表,如果 ...

  8. [NewLife.XCode]实体队列(多线程生产的大数据集中保存)

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  9. 高级数据库,建库,建表,建约束

    use master --建库,dbtime,名称time create database dbtime on primary (name = 'Time.mdf',fileName = 'E:\Ti ...

最新文章

  1. python如何最适合web开发中的人工智能?
  2. utorrent设置上传速度_utorrent下载速度慢怎样设置 utorrent常用设置图文教程
  3. 利用原生js 如何实现div移动?
  4. html设置复选框图片,css实现图片右上角添加复选框的方法
  5. ITK:可视化静态稀疏Whitaker 2D水平设置图层
  6. python实战之编码问题:中文!永远的痛
  7. 原码、反码、补码,计算机中所有的数都是以补码的形式存储的
  8. Java 格式转换:利用格式转换实现随机数生成随机 char 字母及 string 字母串
  9. [转载] java语言程序设计-基础篇
  10. Android视频开发基础(二)
  11. HttpServletRequest应用-获取请求参数及解决中文乱码
  12. WinRAR v5.90 正式版简体中文汉化特别版本
  13. Linux间共享文件夹
  14. 【SDC】StreamSets实战之路-11-基础篇- StreamSets-数据流开发- Edge数据流设计
  15. 基于mysql的报表工具有哪些?值得推荐的mysql报表工具
  16. 学习记录476@linux硬盘分区
  17. win10电脑外接音响没声音怎么回事?win10电脑外接音响没声音的修复方法
  18. 【零基础学QT】【052】CLion完美搭建Qt开发环境
  19. 北上资金全透视月报:上月外资大幅流入,增持周期与消费(20210107).PDF
  20. PCB与设备外壳接地问题

热门文章

  1. pta7-7旅游规划(dijkstra算法)
  2. Windows 7 自动更新失败导致无法进系统解决方案
  3. java B2B2C Springcloud多租户电子商城系统-Spring Cloud Sleuth
  4. 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放
  5. [从C到C++] 1.3 C++布尔类型(bool)
  6. Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上
  7. HUAWEI nova 青春版闪速快充,让追剧不再断电
  8. 实验三《实时系统的移植》 20145222黄亚奇 20145213祁玮
  9. 安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法
  10. angular $watch