iT邦幫忙

DAY 6
3

Kuick Hands on Labs系列 第 6

Kuick Hands on Labs -- 6. Entity CRUD (2)

上一篇概觀地了解Kuick與EF的基本差異之後,這一篇開始詳細地說明CRUD每一項操作;從「Entity欄位定義與新增資料」講起。
<Entity欄位定義>
Kuick採用Attribute對於Entity欄位進行定義,一個標準的欄位,至少需包含DataMemberAttribute以及ColumnSpec。為了明確地一一說明每一個Attribute的用途,下列的說明程式碼,僅列出該項說明所介紹的Attribute:

  1. 可序列化:使用DataMemberAttribute標示可序列欄位

    [DataMember]
    public string EmployeeID { get; set; }

  2. 欄位備註:使用DescriptionAttribute進行欄位備註

    [Description("員工代碼")]
    public string EmployeeID { get; set; }

  3. 資料層:使用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; }

  4. 資料層:使用ColumnRefer進行欄位「邏輯層」定義
    資料庫FK(外部鍵)的概念,傳入欄位所指向的物件Type。

    [ColumnRefer(typeof(EmployeeEntity))]
    public string EmployeeID { get; set; }

  5. 資料層:使用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; }
  1. 使用ColumnEncrypt進行欄位「邏輯層」定義
    使用Encryption列舉參數,定義欄位值加密方式

    [ColumnEncrypt(Encryption.Asymmetry)] // 非對稱加密
    public string Password { get; set; }

  2. 資料層:使用ColumnIdentity進行欄位「邏輯層」定義
    每一種資料庫實作欄位值遞增的方式皆不相同,為了避免設計期就限制系統必需部署在特定的資料庫,所以特定透過內建的Identity服務,達成欄位值遞增的功能。

    // Frequency指示遞增值歸零頻率
    // 由100000開始遞增
    // 每次增加 1
    [ColumnIdentity(Frequency.Once, 100000, 1)]
    public string OrderID { get; set; }

  3. 呈現層:使用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"
}

上一篇
Kuick Hands on Labs -- 5. Entity CRUD (1)
下一篇
Kuick Hands on Labs -- 7. Entity CRUD (3)
系列文
Kuick Hands on Labs30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言