上一篇概觀地了解Kuick與EF的基本差異之後,這一篇開始詳細地說明CRUD每一項操作;從「Entity欄位定義與新增資料」講起。
<Entity欄位定義>
Kuick採用Attribute對於Entity欄位進行定義,一個標準的欄位,至少需包含DataMemberAttribute以及ColumnSpec。為了明確地一一說明每一個Attribute的用途,下列的說明程式碼,僅列出該項說明所介紹的Attribute:
可序列化:使用DataMemberAttribute標示可序列欄位
[DataMember]
public string EmployeeID { get; set; }
欄位備註:使用DescriptionAttribute進行欄位備註
[Description("員工代碼")]
public string EmployeeID { get; set; }
資料層:使用ColumnSpec進行欄位資料層定義
PK欄位,資料長度32。因為是PK,所以預設一定是not null,其他一般欄位預設是null,如果設定成not null欄位,可以使用列舉參數值SpecFlag.NotAllowNull
強制資料欄位為not null。
[ColumnSpec(SpecFlag.PrimaryKey, 32)]
public string EmployeeID { get; set; }
[ColumnSpec(SpecFlag.NotAllowNull, 50)]
public string FullName { get; set; }
資料層:使用ColumnRefer進行欄位「邏輯層」定義
資料庫FK(外部鍵)的概念,傳入欄位所指向的物件Type。
[ColumnRefer(typeof(EmployeeEntity))]
public string EmployeeID { get; set; }
資料層:使用ColumnInitiate進行欄位「邏輯層」定義
欄位預設值,可以是設計期已知的固定值,也可以是執行期才知道的變數,由於Attribute的特性要求,其傳入參數值必需是設計期已知的固定值,為了達成可以指定執行期才知道的數值,ColumnInitiate提供以InitiateValue舉列作為傳入參數的方法。
常用的ColumnInitiate參數:
.Empty:空字串
.Uuid:Uuid字串,刪除「-」符號轉成大寫
.UuidAndAutoUpdate:Uuid字串,刪除「-」符號轉成大寫,並且在每一次的修改時,自動更新。
.NullDate:填入1753-01-01,SQL Server允許最小的時間。
.MaxDate:填入9999-12-31。
.Date4:填入執行期當下時間yyyy。
.Date8s:填入執行期當下時間yyyyMMdd。
.Date8:填入執行期當下時間yyyy-MM-dd。
.Date14s:填入執行期當下時間yyyyMMddhhmmss。
.Date14:填入執行期當下時間yyyy-MM-dd hh:mm:ss。
.Date17s:填入執行期當下時間yyyyMMddhhmmssfff。
.Date17:填入執行期當下時間yyyy-MM-dd hh:mm:ss.fff。
.Date14AutoUpdate:填入執行期當下時間yyyy-MM-dd hh:mm:ss,並且在每一次的修改時,自動更新。
.Date17AutoUpdate:填入執行期當下時間yyyy-MM-dd hh:mm:ss.fff,並且在每一次的修改時,自動更新。
.ToUpper:新增與修改時,將這個欄位值英文字母轉成大寫。
.ToLower:新增與修改時,將這個欄位值英文字母轉成小寫。
// 設計期已知
[ColumnInitiate(10)]
public int Level { get; set; }
// 設計期未知
[ColumnInitiate(ColumnInitiate.Uuid)]
public string OrderID { get; set; }
[ColumnInitiate(ColumnInitiate.Date17AutoUpdate)]
public DateTime LastModifiedDate { get; set; }
使用ColumnEncrypt進行欄位「邏輯層」定義
使用Encryption列舉參數,定義欄位值加密方式
[ColumnEncrypt(Encryption.Asymmetry)] // 非對稱加密
public string Password { get; set; }
資料層:使用ColumnIdentity進行欄位「邏輯層」定義
每一種資料庫實作欄位值遞增的方式皆不相同,為了避免設計期就限制系統必需部署在特定的資料庫,所以特定透過內建的Identity服務,達成欄位值遞增的功能。
// Frequency指示遞增值歸零頻率
// 由100000開始遞增
// 每次增加 1
[ColumnIdentity(Frequency.Once, 100000, 1)]
public string OrderID { get; set; }
呈現層:使用ColumnVisual進行欄位「呈現層」定義
ColumnVisual的設定,留待最後「Entity的資料列表與維護表單」,再詳細說明。
<以EmployeeEntity為例>
EmployeeEntity欄位定義
// PK欄位
[DataMember]
[Description("帳號")]
[ColumnSpec(SpecFlag.PrimaryKey)]
public string EmployeeID { get; set; }
//密碼非同步加密
[DataMember]
[Description("密碼")]
[ColumnSpec(SpecFlag.NotAllowNull, 500)]
[ColumnEncrypt(Encryption.Asymmetry)]
public string Password { get; set; }
// 全名not null
[DataMember]
[Description("全名")]
[ColumnSpec(SpecFlag.NotAllowNull, 50)]
public string FullName { get; set; }
// 電郵 null
[DataMember]
[Description("電郵")]
[ColumnSpec(200)]
public string Email { get; set; }
// 等級預設為 8
[DataMember]
[Description("等級")]
[ColumnSpec]
[ColumnInitiate(8)]
public int Level { get; set; }
// 繼承自ObjectEntity
// 資料建立時戳,自動填入執行期新增時17碼時戳
[DataMember]
[Category(DataConstants.Entity.Category)]
[ColumnSpec(CREATE_DATE, SpecFlag.ReadOnly)]
[ColumnInitiate(InitiateValue.Date17)]
[ColumnVisual(VisualFlag.SystemColumn)]
[IgnoreDiff]
public DateTime CreateDate { get; set; }
// 繼承自ObjectEntity
// 資料最近修改時戳,自動填入執行期新增與修改時17碼時戳
[DataMember]
[Category(DataConstants.Entity.Category)]
[ColumnSpec(LAST_MODIFIED_DATE)]
[ColumnInitiate(InitiateValue.Date17AutoUpdate)]
[ColumnVisual(VisualFlag.SystemColumn)]
[IgnoreDiff]
public DateTime LastModifiedDate { get; set; }
// 繼承自ObjectEntity
// 資料有效性,預設為true
[DataMember]
[Category(DataConstants.Entity.Category)]
[ColumnSpec(FLAG)]
[ColumnInitiate(true)]
[ColumnVisual(VisualFlag.SystemColumn)]
[IgnoreDiff]
public bool Flag { get; set; }
// 繼承自Entity
// 資料版本號,新增與修改時自動更新Uuid
// 避免同步(Concurrency)處理時產生資料一致性問題
[DataMember]
[ColumnSpec(VERSION_NUMBER)]
[ColumnInitiate(InitiateValue.UuidAndAutoUpdate)]
[ColumnVisual(VisualFlag.SystemColumn)]
public string VersionNumber { get; set; }
程式新增資料
EmployeeEntity employee = new EmployeeEntity() {
EmployeeID = "kevin",
Password = "ironman6",
FullName = "鍾春懿",
Email = "kevinjong@gmail.com"
};
employee.Add();
Log檔產生的SQL Command
2013-10-06 05:12:06.217 136 >>> YAWSMF56GBUEXPHFA3YECW2RXI Track
Title : Api.Add
01. Elapsed (seconds) = 0.048
02. Connection SessionID = SYMPCLVN6DHEPGBJLQOTSKA55M
03. SQL Command String = INSERT INTO T_EMPLOYEE (
[EMPLOYEE_ID], [PASSWORD], [FULL_NAME], [EMAIL], [LEVEL], [CREATE_DATE], [LAST_MODIFIED_DATE], [FLAG], [VERSION_NUMBER]
) VALUES (
@EMPLOYEE_ID, @PASSWORD, @FULL_NAME, @EMAIL, @LEVEL, @CREATE_DATE, @LAST_MODIFIED_DATE, @FLAG, @VERSION_NUMBER
)
04. SQL Parameters = following 9 items
05. @EMPLOYEE_ID = kevin
06. @PASSWORD = Encrypted:xeRPKH6LwktDpd4M6BAMO/NG3OT9nrdbM+OK0OEWKgamv/uafPkXBvtyeXEvne1LYISbf2+Fxi9UXhPMbLcbCw==
07. @FULL_NAME = 鍾春懿
08. @EMAIL = kevinjong@gmail.com
09. @LEVEL = 8
10. @CREATE_DATE = 2013-10-06 05:12:03
11. @LAST_MODIFIED_DATE = 2013-10-06 05:12:06
12. @FLAG = true
13. @VERSION_NUMBER = MHISCBX6LIKEVOJSVESB5EV47Y
資料庫的資料內容
// 以json格式表達
{
"EmployeeID" : "kevin",
"Password" : "Encrypted:xeRPKH6LwktDpd4M6BAMO/NG3OT9nrdbM+OK0OEWKgamv/uafPkXBvtyeXEvne1LYISbf2+Fxi9UXhPMbLcbCw==",
"FullName" : "鍾春懿",
"Email" : "kevinjong@gmail.com",
"Level" : 8,
"CreateDate" : "2013-10-06T05:12:03.49",
"LastModifiedDate" : "2013-10-06T05:12:06.175",
"Flag" : true,
"VersionNumber" : "MHISCBX6LIKEVOJSVESB5EV47Y"
}