在 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 種資料選取相關的類別方法
修改
資料修改屬於物件方法
UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Modify();
刪除
資料刪除屬於物件方法
UserEntity user = UserEntity.Get("kevinjong");
// ...
Result result = user.Remove();
執行 Sql Command 或 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