iT邦幫忙

DAY 18
2

Kuick Application & ORM Framework系列 第 18

Kuick -- Entity『自我描述規格』『直接存取資料』

  • 分享至 

  • twitterImage
  •  

在 Kuick ORM 裡,Entity 採行繼承設計,取得內建的多項功能,其中包含自我描述規格,以及可以直接與資料庫溝通,不像其他 ORM Framework 需要透過類似資料庫或是資料庫連線物件間接處理 (例如 EF 的 ObjectContext, DbContext)。

這篇分享以 Entity『自我描述規格』『直接存取資料』為主題,作為進階說明的開始,同時說明 Kuick 的資料操作方法命名規則。

『自我描述規格』已經在前篇分享『Kuick Entity:Schema Cache 規格快取』說明,本文將重點放在『直接存取資料庫』的功能上。

<資料操作方法命名規則>
有關於資料操作方法命名規則,簡略劃分成『表現層』、『邏輯層』、『資料層』3 個層次命名如下。切記,在考量特定的宗教信仰時,新增方法不可使用 Create 為名,因為 Create 只能由上帝來執行。

<直接存取資料>
對資料庫的操作分成靜態的類別方法 (class function) 與物件方法 (instance function),其中對於單筆資料的新增、修改、刪除是屬於物件方法之外,其餘的屬於類別方法,設計期未知的資料操作方法,大部份實作於 Kuick.Entity 裡,設計期已知的資料操作方法,則大部份實作於 Kuick.Entity<T> 裡,下列依據資料的 CRUD 與直接執行指令分項說明,再將實作於 Kuick.Entity, Kuick.Entity<T> 裡相關的定義摘要如下:

新增
資料新增屬於物件方法

UserEntity user = new UserEntity();
// ...
Result result = user.Add();

選取
內建 9 種資料選取相關的類別方法

  1. Get 使用鍵值選取單筆。
  2. GetAll 取出所有資料。
  3. Count 一般化計數。
  4. Exists 是否存在驗證。
  5. Query 一般化多筆選取。
  6. QueryFirst 一般化首筆選取。
  7. Search 直覺式搜尋。
  8. SearchCount 直覺式搜尋筆數計算。
  9. SearchExists 直覺式搜尋驗證。

修改
資料修改屬於物件方法

UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Modify();

刪除
資料刪除屬於物件方法

UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Remove();

執行 Sql Command 或 Stored Procedure

  1. ExecuteNonQuery 執行 Sql Command 但不回傳資料
  2. ExecuteQuery 執行 Sql Command 且回傳資料
  3. ExecuteScalar 執行 Sql Command 且回傳第一筆第一個欄位資料
  4. ExecuteStoredProcedure 執行 Stored Procedure 且回傳資料

下載原始檔 --> kuick.codeplex.com

public class Entity 
	: DynamicData, IEntity, IIsNull, IValidate, IDynamicData
{
	// 物件方法 (instance function)
	public Result Add();
	public Result Modify();
	public Result Remove();

	// 類別方法 (class function)
	public static Result ExecuteNonQuery(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Result ExecuteNonQuery(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteQuery(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteQuery(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Any ExecuteScalar(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static Any ExecuteScalar(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteStoredProcedure(
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static List<Entity> ExecuteStoredProcedure(
		string entityName, 
		string sql, 
		params IDbDataParameter[] parameters
	);
	public static bool Exists(
		string entityName, 
		params Any[] anys
	);

	public static IEntity Get(
		string entityName, 
		string keyValue
	);
	public static List<IEntity> GetAll(
		string entityName
	);
	
	public static List<IEntity> Query(
		string entityName, 
		params Any[] anys
	);
	public static IEntity QueryFirst(
		string entityName, 
		params Any[] anys
	);
	public static Result Remove(
		string entityName, 
		string keyValue
	);
	public static List<IEntity> Search(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static List<IEntity> Search(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string entityName, 
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string entityName, 
		string keyword, 
		Action<Sql> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
}

public class Entity<T> 
	: Entity where T : class, IEntity, new()
{
	// 類別方法 (class function)
	public static int Count(
		Expression<Func<T, object>> expression
	);
	public static int Count(
		params Any[] anys
	);
	public static int Count(
		Expression<Func<T, object>> expression, 
		Action<Sql<T>> interceptor
	);
	public static Result ExecuteNonQuery(
		string sql, 
		params DbParameter[] parameters
	);
	public static List<T> ExecuteQuery(
		string sql, 
		params DbParameter[] parameters
	);
	public static Any ExecuteScalar(
		string sql, 
		params DbParameter[] parameters
	);
	public static List<T> ExecuteStoredProcedure(
		string sql, 
		params DbParameter[] parameters
	);
	public static bool Exists(
		Expression<Func<T, object>> expression
	);
	public static bool Exists(
		params Any[] anys
	);
	public static bool Exists(
		string keyValue
	);
	public static T Get(
		string keyValue
	);
	public static List<T> GetAll();
	public static List<T> Query(
		Expression<Func<T, object>> expression
	);
	public static T QueryFirst(
		Expression<Func<T, object>> expression
	);
	public static Result Remove(
		Expression<Func<T, object>> expression
	);
	public static Result Remove(
		params Any[] anys
	);
	public static Result Remove(
		string keyValue
	);
	public static List<T> Search(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static List<T> Search(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static int SearchCount(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static bool SearchExists(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string keyword, 
		params string[] skipColumnNamesOrPropertyNames
	);
	public static Result SearchRemove(
		string keyword, 
		Action<Sql<T>> interceptor, 
		params string[] skipColumnNamesOrPropertyNames
	);
}

======================================================

系統開發需正確處理『設計期』與『執行期』的差異,以及區分什麼是『設計議題』什麼是『部署議題』,下一篇說明 Kuick ORM 如何處理這些差異實作出更加直覺的 ORM Framework。

========================================
鐵人賽分享列表:Kuick Application & ORM Framework
開放原始碼專案:kuick.codeplex.com
直接下載原始碼:Kuick
下載相關文件檔:C# Code Conventions and Design Guideline
相關教學影片區:Kuick on YouTube


上一篇
Kuick -- 進階說明之前
下一篇
Kuick -- 設計期 vs. 執行期,設計議題 vs. 部署議題
系列文
Kuick Application & ORM Framework34
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言