[NewLife.XCode]数据模型文件
NewLife.XCode是一個(gè)有10多年歷史的開源數(shù)據(jù)中間件,由新生命團(tuán)隊(duì)(2002~2019)開發(fā)完成并維護(hù)至今,以下簡稱XCode。
整個(gè)系列教程會(huì)大量結(jié)合示例代碼和運(yùn)行日志來進(jìn)行深入分析,蘊(yùn)含多年開發(fā)經(jīng)驗(yàn)于其中。
開源地址:https://github.com/NewLifeX/X?(求star, 620+)
?
回到目錄
數(shù)據(jù)模型文件
數(shù)據(jù)模型文件是XCode數(shù)據(jù)庫開發(fā)的中心,曾經(jīng)流行和支持的DB First和Entity First,經(jīng)過10多年優(yōu)勝劣汰,只剩下Model First。
XCode的數(shù)據(jù)模型文件就是一個(gè)Model.xml,(名字可變),同目錄配套Build.tt,用于在vs里調(diào)用XCode生成基于xml模型文件的多個(gè)實(shí)體類文件。
從nuget安裝NewLife.XCode時(shí),可以看到項(xiàng)目下多了一個(gè)Model.xml和Build.tt,(nfx項(xiàng)目才有,netcore版本由于發(fā)布腳本的原因未能兼容)。
其中的Model.xml正是供我們進(jìn)行數(shù)據(jù)建模的參考,同時(shí)也是XCode內(nèi)部Membership的模型文件。
<?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="手機(jī)" />
<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="登錄次數(shù)" />
<Column Name="LastLogin" DataType="DateTime" Description="最后登錄" />
<Column Name="LastLoginIP" DataType="String" Description="最后登錄IP" />
<Column Name="RegisterTime" DataType="DateTime" Description="注冊時(shí)間" />
<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="系統(tǒng)。用于業(yè)務(wù)系統(tǒng)開發(fā)使用,不受數(shù)據(jù)權(quán)限約束,禁止修改名稱或刪除" />
<Column Name="Remark" DataType="String" Description="說明" />
<Column Name="Permission" DataType="String" Length="500" Description="權(quán)限。對不同資源的權(quán)限,逗號分隔,每個(gè)資源的權(quán)限子項(xiàng)豎線分隔" />
<Column Name="CreateUserID" DataType="Int32" Description="創(chuàng)建用戶" />
<Column Name="CreateIP" DataType="String" Description="創(chuàng)建地址" />
<Column Name="CreateTime" DataType="DateTime" Description="創(chuàng)建時(shí)間" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新用戶" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新時(shí)間" />
</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="圖標(biāo)" />
<Column Name="Visible" DataType="Boolean" Description="可見" />
<Column Name="Necessary" DataType="Boolean" Description="必要。必要的菜單,必須至少有角色擁有這些權(quán)限,如果沒有則自動(dòng)授權(quán)給系統(tǒng)角色" />
<Column Name="Permission" DataType="String" Length="200" Description="權(quán)限子項(xiàng)。逗號分隔,每個(gè)權(quán)限子項(xiàng)名值豎線分隔" />
<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="時(shí)間" />
<Column Name="Remark" DataType="String" Length="500" Description="詳細(xì)信息" />
</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="會(huì)話。Web的SessionID或Server的會(huì)話編號" />
<Column Name="Times" DataType="Int32" Description="次數(shù)" />
<Column Name="Page" DataType="String" Description="頁面" />
<Column Name="Status" DataType="String" Length="200" Description="狀態(tài)" />
<Column Name="OnlineTime" DataType="Int32" Description="在線時(shí)間。本次在線總時(shí)間,秒" />
<Column Name="CreateIP" DataType="String" Description="創(chuàng)建地址" />
<Column Name="CreateTime" DataType="DateTime" Description="創(chuàng)建時(shí)間" />
<Column Name="UpdateTime" DataType="DateTime" Description="修改時(shí)間" />
</Columns>
<Indexes>
<Index Columns="UserID" />
<Index Columns="SessionID" />
<Index Columns="CreateTime" />
</Indexes>
</Table>
<Table Name="VisitStat" Description="訪問統(tǒng)計(jì)" 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="時(shí)間" />
<Column Name="Page" DataType="String" Nullable="False" Description="頁面" />
<Column Name="Title" DataType="String" Master="True" Description="標(biāo)題" />
<Column Name="Times" DataType="Int32" Description="次數(shù)" />
<Column Name="Users" DataType="Int32" Description="用戶" />
<Column Name="IPs" DataType="Int32" Description="IP" />
<Column Name="Error" DataType="Int32" Description="錯(cuò)誤" />
<Column Name="Cost" DataType="Int32" Description="耗時(shí)。毫秒" />
<Column Name="MaxCost" DataType="Int32" Description="最大耗時(shí)。毫秒" />
<Column Name="CreateTime" DataType="DateTime" Description="創(chuàng)建時(shí)間" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新時(shí)間" />
<Column Name="Remark" DataType="String" Length="500" Description="詳細(xì)信息" />
</Columns>
<Indexes>
<Index Columns="Page,Level,Time" Unique="True" />
<Index Columns="Level,Time" />
</Indexes>
</Table>
</Tables>
真實(shí)項(xiàng)目開發(fā)中,一般數(shù)據(jù)層類庫項(xiàng)目為不同子模塊劃分目錄,每個(gè)目錄有自己的Model.xml+Build.tt,負(fù)責(zé)本模塊的模型維護(hù)已經(jīng)實(shí)體類生成。
頭部屬性解釋:
Output,輸出目錄
NameSpace,命名空間
ConnName,連接名,對應(yīng)app.config/web.config中connectionStrings下的name
BaseEntity,基類,默認(rèn)Entity,同一個(gè)子模塊也可以共用自己的泛型基類EntityBase
Tables中的這些屬性對本模型文件所有Table有效,各個(gè)Table上也可以指定這些屬性,以覆蓋全局設(shè)置
?
Table.Name?就是生成的實(shí)體類類名,如果實(shí)際表名不同,可用TableName指定表名。
Column.Name就是生成的實(shí)體類屬性名,如果實(shí)際字段名不同,可用ColumnName指定字段名。
?
字符串長度Length默認(rèn)50,不建議小于50,-1表示最大ntext
其它字段不建議設(shè)置長度,特別不建議給Double和Decimal設(shè)置精度
?
字段Column只需要DataType指定.Net類型即可,反向工程會(huì)根據(jù)使用數(shù)據(jù)庫的不同而映射到不同數(shù)據(jù)庫類型。
如果不喜歡XCode推薦的數(shù)據(jù)庫類型,可在Column中通過RawType指定原始數(shù)據(jù)庫類型。
Column支持Type指定枚舉類型,建議是帶命名空間的全名。例如上面User表中Sex類型的字段就是枚舉SexKinds
?
可以通過碼神工具/建模工具,從數(shù)據(jù)庫中導(dǎo)出數(shù)據(jù)表對應(yīng)的模型文件;
也可以編碼通過DAL.Export導(dǎo)出模型文件;
魔方的系統(tǒng)管理數(shù)據(jù)庫頁面,也可以導(dǎo)出模型文件;
?
回到目錄
數(shù)據(jù)名字規(guī)范
模型文件的Table名將會(huì)生成實(shí)體類類名,Column字段名將會(huì)生成實(shí)體類屬性名,因此命名規(guī)范很重要。
名稱必須使用通俗易懂的英文單詞全拼,常用的縮略詞(如ID)除外
采用大駝峰命名,每個(gè)單詞首字母大寫,其它小寫,類型屬性名符合.Net規(guī)范
名稱必須簡潔明了,不要加多余的前綴(如表名前加tbl),字段名也不要加表名前綴
?
?
不得使用SQL關(guān)鍵字或C#關(guān)鍵字作為表名或字段名
?
?
使用數(shù)據(jù)庫常用類型,如Int32和String,大文本長度-1
?
?
給表和字段加上說明,作為文件名,以及生成代碼的注釋
?
?
每張表必須有唯一主鍵字段(建議自增ID)
?
?
主從表中,從表加關(guān)聯(lián)字段(主表名+主表主鍵名)。XCode會(huì)識別為主從關(guān)系,生成擴(kuò)展屬性
?
?
每張表設(shè)置好索引,注意是否唯一。XCode會(huì)識別為索引,生成擴(kuò)展查詢
?
回到目錄
數(shù)據(jù)類型規(guī)范
模型文件設(shè)計(jì)要求開發(fā)者有一點(diǎn)數(shù)據(jù)庫基礎(chǔ),至少要能明確表、字段和索引的概念。
然而要求又遠(yuǎn)比數(shù)據(jù)庫要低得多,因?yàn)樵蹅兺瞥?strong>極致簡單的原則。
類型 | 數(shù)據(jù)庫類型 | 推薦 | 備注 | |
Int32 | 整數(shù) | int | 強(qiáng)烈 | ?優(yōu)先 |
String | 字符串 | nvarchar(50) | 強(qiáng)烈 | ?默認(rèn)變長50 |
DateTime | 時(shí)間日期 | datetime | 強(qiáng)烈 | ?不建議純?nèi)掌诨驎r(shí)間 |
Boolean | 布爾型 | bit | 強(qiáng)烈 | ?MySql中建議tinyint替代枚舉來實(shí)現(xiàn)布爾型 |
Int64 | 長整型 | long | 強(qiáng)烈 | ?有可能超過21億的整數(shù),選長整型 |
Decimal | 十進(jìn)制 | money | 慎用 | ?高精度貨幣型時(shí)采用 |
Double | 雙精度 | double | 慎用 | ?特別慎用,避免浮點(diǎn)運(yùn)算導(dǎo)致精度丟失? |
Int16 | short | 禁用 | ?由Int32替代 | |
Byte | tinyint | 禁用 | ?由Int32替代? | |
Single | single | 禁用 | ?由Double替代? |
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
回到目錄
常用字段推薦
為了便于開發(fā),XCode默認(rèn)優(yōu)待以下字段:
<Column Name="CreateUser" DataType="String" Description="創(chuàng)建者" />
<Column Name="CreateUserID" DataType="Int32" Description="創(chuàng)建者" />
<Column Name="CreateTime" DataType="DateTime" Description="創(chuàng)建時(shí)間" />
<Column Name="CreateIP" DataType="String" Description="創(chuàng)建地址" />
<Column Name="UpdateUser" DataType="String" Description="更新者" />
<Column Name="UpdateUserID" DataType="Int32" Description="更新者" />
<Column Name="UpdateTime" DataType="DateTime" Description="更新時(shí)間" />
<Column Name="UpdateIP" DataType="String" Description="更新地址" />
?
時(shí)間組CreateTime/UpdateTime字段對應(yīng)TimeModule,在新增或更新時(shí)自動(dòng)賦值;
IP組CreateIP/UpdateIP字段對應(yīng)IPModule,在Web新增或更新時(shí)自動(dòng)賦值;
用戶組CreateUser(ID)/UpdateUser(ID)字段對應(yīng)UserModule,在Web新增或更新時(shí)字段賦值;
一句話:用了這些字段,在Insert時(shí)自動(dòng)給CreateAbc賦值,在Update時(shí)自動(dòng)給UpdateAbc賦值!
?
?
回到目錄
系列教程
NewLife.XCode教程系列[2019版]
增刪改查入門。快速展現(xiàn)用法,代碼配置連接字符串
數(shù)據(jù)模型文件。建立表格字段和索引,名字以及數(shù)據(jù)類型規(guī)范,推薦字段(時(shí)間,用戶,IP)
實(shí)體類詳解。數(shù)據(jù)類業(yè)務(wù)類,泛型基類,接口
功能設(shè)置。連接字符串,調(diào)試開關(guān),SQL日志,慢日志,參數(shù)化,執(zhí)行超時(shí)。代碼與配置文件設(shè)置,連接字符串局部設(shè)置
反向工程。自動(dòng)建立數(shù)據(jù)庫數(shù)據(jù)表
數(shù)據(jù)初始化。InitData寫入初始化數(shù)據(jù)
高級增刪改。重載攔截,自增字段,Valid驗(yàn)證,實(shí)體模型(時(shí)間,用戶,IP)
臟數(shù)據(jù)。如何產(chǎn)生,怎么利用
增量累加。高并發(fā)統(tǒng)計(jì)
事務(wù)處理。單表和多表,不同連接,多種寫法
擴(kuò)展屬性。多表關(guān)聯(lián),Map映射
高級查詢。復(fù)雜條件,分頁,自定義擴(kuò)展FieldItem,查總記錄數(shù),查匯總統(tǒng)計(jì)
數(shù)據(jù)層緩存。Sql緩存,更新機(jī)制
實(shí)體緩存。全表整理緩存,更新機(jī)制
對象緩存。字典緩存,適用用戶等數(shù)據(jù)較多場景。
百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
實(shí)體工廠。元數(shù)據(jù),通用處理程序
角色權(quán)限。Membership
導(dǎo)入導(dǎo)出。Xml,Json,二進(jìn)制,網(wǎng)絡(luò)或文件
分表分庫。常見拆分邏輯
高級統(tǒng)計(jì)。聚合統(tǒng)計(jì),分組統(tǒng)計(jì)
批量寫入。批量插入,批量Upsert,異步保存
實(shí)體隊(duì)列。寫入級緩存,提升性能。
備份同步。備份數(shù)據(jù),恢復(fù)數(shù)據(jù),同步數(shù)據(jù)
數(shù)據(jù)服務(wù)。提供RPC接口服務(wù),遠(yuǎn)程執(zhí)行查詢,例如SQLite網(wǎng)絡(luò)版
大數(shù)據(jù)分析。ETL抽取,調(diào)度計(jì)算處理,結(jié)果持久化
總結(jié)
以上是生活随笔為你收集整理的[NewLife.XCode]数据模型文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初探奥尔良(Orleans)
- 下一篇: [NewLife.XCode]高级增删改