[NewLife.XCode]数据模型文件

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

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中。

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

 

回到目录

数据模型文件

数据模型文件是XCode数据库开发的中心,曾经流行和支持的DB First和Entity First,经过10多年优胜劣汰,只剩下Model First。

XCode的数据模型文件就是一个Model.xml,(名字可变),同目录配套Build.tt,用于在vs里调用XCode生成基于xml模型文件的多个实体类文件。

从nuget安装NewLife.XCode时,可以看到项目下多了一个Model.xml和Build.tt,(nfx项目才有,netcore版本由于发布脚本的原因未能兼容)。

其中的Model.xml正是供我们进行数据建模的参考,同时也是XCode内部Membership的模型文件。

640?wx_fmt=gif

<?xml version="1.0" encoding="utf-8"?>
<Tables Version="9.6.6663.16294" NameSpace="XCode.Membership" ConnName="Membership" Output="" BaseClass="Entity"
xmlns
="http://www.newlifex.com/ModelSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.newlifex.com https://raw.githubusercontent.com/NewLifeX/X/master/XCode/ModelSchema.xsd" >
<Table Name="User" Description="用户" DbType="SqlServer" RenderGenEntity="true">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称。登录用户名" />
<Column Name="Password" DataType="String" Description="密码" />
<Column Name="DisplayName" DataType="String" Description="昵称" />
<Column Name="Sex" DataType="Int32" Description="性别。未知、男、女" Type="SexKinds" />
<Column Name="Mail" DataType="String" Description="邮件" />
<Column Name="Mobile" DataType="String" Description="手机" />
<Column Name="Code" DataType="String" Description="代码。身份证、员工编号等" />
<Column Name="Avatar" DataType="String" Length="200" Description="头像" />
<Column Name="RoleID" DataType="Int32" Description="角色。主要角色" />
<Column Name="RoleIDs" DataType="String" Length="200" Description="角色组。次要角色集合" />
<Column Name="Online" DataType="Boolean" Description="在线" />
<Column Name="Enable" DataType="Boolean" Description="启用" />
<Column Name="Logins" DataType="Int32" Description="登录次数" />
<Column Name="LastLogin" DataType="DateTime" Description="最后登录" />
<Column Name="LastLoginIP" DataType="String" Description="最后登录IP" />
<Column Name="RegisterTime" DataType="DateTime" Description="注册时间" />
<Column Name="RegisterIP" DataType="String" Description="注册IP" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
<Index Columns="RoleID" />
</Indexes>
</Table>
<Table Name="Role" Description="角色" RenderGenEntity="true">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="IsSystem" DataType="Boolean" Description="系统。用于业务系统开发使用,不受数据权限约束,禁止修改名称或删除" />
<Column Name="Remark" DataType="String" Description="说明" />
<Column Name="Permission" DataType="String" Length="500" Description="权限。对不同资源的权限,逗号分隔,每个资源的权限子项竖线分隔" />
<Column Name="CreateUserID" DataType="Int32" Description="创建用户" />
<Column Name="CreateIP" DataType="String" Description="创建地址" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新用户" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" />
</Columns>
<Indexes>
<Index Columns="Name" Unique="True" />
</Indexes>
</Table>
<Table Name="Menu" Description="菜单" BaseType="EntityTree" RenderGenEntity="true">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Name" DataType="String" Master="True" Nullable="False" Description="名称" />
<Column Name="DisplayName" DataType="String" Description="显示名" />
<Column Name="FullName" DataType="String" Length="200" Description="全名" />
<Column Name="ParentID" DataType="Int32" Description="父编号" />
<Column Name="Url" DataType="String" Length="200" Description="链接" />
<Column Name="Sort" DataType="Int32" Description="排序" />
<Column Name="Icon" DataType="String" Description="图标" />
<Column Name="Visible" DataType="Boolean" Description="可见" />
<Column Name="Necessary" DataType="Boolean" Description="必要。必要的菜单,必须至少有角色拥有这些权限,如果没有则自动授权给系统角色" />
<Column Name="Permission" DataType="String" Length="200" Description="权限子项。逗号分隔,每个权限子项名值竖线分隔" />
<Column Name="Remark" DataType="String" Length="200" Description="备注" />
</Columns>
<Indexes>
<Index Columns="Name" />
<Index Columns="ParentID,Name" Unique="True" />
</Indexes>
</Table>
<Table Name="Log" Description="日志" ConnName="Log" RenderGenEntity="true">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Category" DataType="String" Description="类别" />
<Column Name="Action" DataType="String" Description="操作" />
<Column Name="LinkID" DataType="Int32" Description="链接" />
<Column Name="UserName" DataType="String" Description="用户名" />
<Column Name="CreateUserID" DataType="Int32" Description="用户编号" />
<Column Name="CreateIP" DataType="String" Description="IP地址" />
<Column Name="CreateTime" DataType="DateTime" Description="时间" />
<Column Name="Remark" DataType="String" Length="500" Description="详细信息" />
</Columns>
<Indexes>
<Index Columns="Category" />
<Index Columns="CreateUserID" />
<Index Columns="CreateTime" />
</Indexes>
</Table>
<Table Name="UserOnline" Description="用户在线" ConnName="Log">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="UserID" DataType="Int32" Description="用户" />
<Column Name="Name" DataType="String" Master="True" Description="名称" />
<Column Name="SessionID" DataType="String" Description="会话。Web的SessionID或Server的会话编号" />
<Column Name="Times" DataType="Int32" Description="次数" />
<Column Name="Page" DataType="String" Description="页面" />
<Column Name="Status" DataType="String" Length="200" Description="状态" />
<Column Name="OnlineTime" DataType="Int32" Description="在线时间。本次在线总时间,秒" />
<Column Name="CreateIP" DataType="String" Description="创建地址" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
<Column Name="UpdateTime" DataType="DateTime" Description="修改时间" />
</Columns>
<Indexes>
<Index Columns="UserID" />
<Index Columns="SessionID" />
<Index Columns="CreateTime" />
</Indexes>
</Table>
<Table Name="VisitStat" Description="访问统计" ConnName="Log">
<Columns>
<Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
<Column Name="Level" DataType="Int32" Description="层级" Type="XCode.Statistics.StatLevels" />
<Column Name="Time" DataType="DateTime" Description="时间" />
<Column Name="Page" DataType="String" Nullable="False" Description="页面" />
<Column Name="Title" DataType="String" Master="True" Description="标题" />
<Column Name="Times" DataType="Int32" Description="次数" />
<Column Name="Users" DataType="Int32" Description="用户" />
<Column Name="IPs" DataType="Int32" Description="IP" />
<Column Name="Error" DataType="Int32" Description="错误" />
<Column Name="Cost" DataType="Int32" Description="耗时。毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗时。毫秒" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" />
<Column Name="Remark" DataType="String" Length="500" Description="详细信息" />
</Columns>
<Indexes>
<Index Columns="Page,Level,Time" Unique="True" />
<Index Columns="Level,Time" />
</Indexes>
</Table>
</Tables>

640?wx_fmt=gif

真实项目开发中,一般数据层类库项目为不同子模块划分目录,每个目录有自己的Model.xml+Build.tt,负责本模块的模型维护已经实体类生成。

头部属性解释:

Output,输出目录

NameSpace,命名空间

ConnName,连接名,对应app.config/web.config中connectionStrings下的name

BaseEntity,基类,默认Entity,同一个子模块也可以共用自己的泛型基类EntityBase

Tables中的这些属性对本模型文件所有Table有效,各个Table上也可以指定这些属性,以覆盖全局设置

 

Table.Name 就是生成的实体类类名,如果实际表名不同,可用TableName指定表名。

Column.Name就是生成的实体类属性名,如果实际字段名不同,可用ColumnName指定字段名。

 

字符串长度Length默认50,不建议小于50,-1表示最大ntext

其它字段不建议设置长度,特别不建议给Double和Decimal设置精度

 

字段Column只需要DataType指定.Net类型即可,反向工程会根据使用数据库的不同而映射到不同数据库类型。

如果不喜欢XCode推荐的数据库类型,可在Column中通过RawType指定原始数据库类型。

Column支持Type指定枚举类型,建议是带命名空间的全名。例如上面User表中Sex类型的字段就是枚举SexKinds

 

可以通过码神工具/建模工具,从数据库中导出数据表对应的模型文件;

也可以编码通过DAL.Export导出模型文件;

魔方的系统管理数据库页面,也可以导出模型文件;

 

回到目录

数据名字规范

模型文件的Table名将会生成实体类类名,Column字段名将会生成实体类属性名,因此命名规范很重要。

  1. 名称必须使用通俗易懂的英文单词全拼,常用的缩略词(如ID)除外

  2. 采用大驼峰命名,每个单词首字母大写,其它小写,类型属性名符合.Net规范

  3. 名称必须简洁明了,不要加多余的前缀(如表名前加tbl),字段名也不要加表名前缀

  4.  

     

    不得使用SQL关键字或C#关键字作为表名或字段名

  5.  

     

    使用数据库常用类型,如Int32和String,大文本长度-1

  6.  

     

    给表和字段加上说明,作为文件名,以及生成代码的注释

  7.  

     

    每张表必须有唯一主键字段(建议自增ID)

  8.  

     

    主从表中,从表加关联字段(主表名+主表主键名)。XCode会识别为主从关系,生成扩展属性

  9.  

     

    每张表设置好索引,注意是否唯一。XCode会识别为索引,生成扩展查询

 

回到目录

数据类型规范

模型文件设计要求开发者有一点数据库基础,至少要能明确表、字段和索引的概念。

然而要求又远比数据库要低得多,因为咱们推崇极致简单的原则。

类型


数据库类型

推荐

备注

Int32

整数

int

强烈

 优先

String

字符串

nvarchar(50)

强烈

 默认变长50

DateTime

时间日期

datetime

强烈

 不建议纯日期或时间

Boolean

布尔型

bit

强烈

 MySql中建议tinyint替代枚举来实现布尔型

Int64

长整型

long

强烈

 有可能超过21亿的整数,选长整型

Decimal

十进制

money

慎用

 高精度货币型时采用

Double

双精度

double

慎用

 特别慎用,避免浮点运算导致精度丢失 

Int16


short

禁用

 由Int32替代

Byte


tinyint

禁用

 由Int32替代 

Single


single

禁用

 由Double替代 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

回到目录

常用字段推荐

为了便于开发,XCode默认优待以下字段:

640?wx_fmt=gif

      <Column Name="CreateUser" DataType="String" Description="创建者" />
<Column Name="CreateUserID" DataType="Int32" Description="创建者" />
<Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
<Column Name="CreateIP" DataType="String" Description="创建地址" />
<Column Name="UpdateUser" DataType="String" Description="更新者" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新者" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新时间" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" />

640?wx_fmt=gif

 

时间组CreateTime/UpdateTime字段对应TimeModule,在新增或更新时自动赋值;

IP组CreateIP/UpdateIP字段对应IPModule,在Web新增或更新时自动赋值;

用户组CreateUser(ID)/UpdateUser(ID)字段对应UserModule,在Web新增或更新时字段赋值;

一句话:用了这些字段,在Insert时自动给CreateAbc赋值,在Update时自动给UpdateAbc赋值!

 

 

回到目录

系列教程

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/316641.shtml

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

相关文章

[HNOI2013]数列(差分)

[HNOI2013]数列 problem 洛谷链接 solution 假设每天的股价为 a[i]a[i]a[i]。则需满足 ∀i<ka[i1]−a[i]≤m\forall_{i<k}a[i1]-a[i]\le m∀i<k​a[i1]−a[i]≤m。又有参数满足 m(k−1)<nm(k-1)<nm(k−1)<n。 也就是说每天的股价都可以取到上限&#xf…

24dian(牛客多校第三场)

24dian(牛客多校第三场) 题意&#xff1a; 给你n张牌&#xff0c;每张牌的大小为1 ~ 13&#xff0c;问这些牌与加减乘除任意组合(可以使用括号)&#xff0c;且但所有的有效解在计算过程中都涉及到分数&#xff0c;即非整数&#xff0c;能否组成答案m&#xff0c;如果可以&…

[NewLife.XCode]高级增删改

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

[AtCoder Grand Contest 048] D - Pocky Game(区间dp + 博弈)

problem AtCoder solution 注意&#xff1a;本题不是平等博弈&#xff0c;因为先手只能取最左边&#xff0c;后手只能取最右边。 设 f[l][r][k]:f[l][r][k]:f[l][r][k]: 只剩下区间 [l,r][l,r][l,r] 等待操作&#xff0c;第 lll 堆石子数量为 kkk 的时候&#xff0c;先手是…

P4147 玉蟾宫

P4147 玉蟾宫 题意&#xff1a; 给你一个n * m的矩阵&#xff0c;矩阵每个值有F或R&#xff0c;求最大的全为F的矩阵&#xff0c;输出面积 * 3 题解&#xff1a; 很明显&#xff0c;求最大01矩阵&#xff0c;悬线法或者单调栈 对于模板除了要记熟还要知道原理&#xff0c;不…

[NewLife.XCode]数据初始化

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

I love counting HDU - 6964

I love counting HDU - 6964 题意&#xff1a; 一个数组c&#xff0c;给你了(l,r)一个范围&#xff0c;问这个范围内满足ci ^ a < b数量的有多少&#xff1f; 题解&#xff1a; 我第一反应是莫队&#xff0c;直接莫队得到结果&#xff0c;但是发现样例不对&#xff0c;再…

CF98E Help Shrek and Donkey(纳什博弈 + 大讨论)

problem 洛谷链接 solution 纳什均衡 是博弈论中一种解的概念&#xff0c;它是指满足下面性质的策略组合&#xff1a;任何一位玩家在此策略组合下单方面改变自己的策略&#xff0c;其他玩家策略不变&#xff0c;都不会提高自身的收益。 一个策略组合被称为纳什均衡当且仅当…

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

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netstandard&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0…

树上启发式合并

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

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;本文不…