後台必需能夠自我了解目前總共有那些 Entity,每一個 Entity 的資料規格為何,先列出所有 Entity,再依據規格定義產生後續的資料列表與編修畫面。
ORM 理當能自我解析所擁有的 Entity 規格,雖然有些 ORM 欠缺這方面功能。
在 Kuick 裡可以透過 Kuick.EntityCache(Entity 規格快取類別),讀取系統初始化儲存的 Entity 規格快取,由於 Kuick 的原生組件也有建立 Entity,所以後台需要略過這部份。
例如:在 Kuick.Data.MSSql 資料庫組件裡使用 Entity 讀取資料庫規格定義表,所以需要略過 namespace 以 Kuick.Data 為首的 Entity 類別,以下說明部份摘錄自 http://technet.microsoft.com/:
1. MSSqlSysObjectsEntity
MSSql 的系統資料表:sys.sysobjects
針對資料庫內所建立的每個物件,如條件約束、預設值、記錄、規則和預存程序,各包含一個資料列。
2. MSSqlSysColumnsEntity
MSSql 的系統資料表:[sys.syscolumns](http://technet.microsoft.com /library/ms186816.aspx)
針對每份資料表和檢視中的每個資料行,各傳回一個資料列;針對資料庫內預存程序中的每個參數,各傳回一個資料列。
3. MSSqlSysIndexesEntity
MSSql 的系統資料表:[sys.sysindexes](http://technet.microsoft.com /library/ms190283.aspx)
針對目前資料庫中每個索引和資料表,各包含一個資料列。 這份檢視不支援 XML 索引。 這份檢視並未完整支援資料分割資料表和索引;請改用 sys.indexes (http://technet.microsoft.com/ library/ms173760.aspx) 目錄檢視。
4. MSSqlSysTypesEntity
MSSql 的系統資料表:[sys.systypes](http://technet.microsoft.com /library/ms175109.aspx)
針對資料庫中所定義的每個系統提供資料類型和每個使用者自訂資料類型,各傳回一個資料列。
例如:在 Kuick.Builtin.Mapping 內建多對多服務組件裡的 MappingEntity,儲存任 2 個 Entity 的對應關係,所以需要略過 namespace 以 Kuick.Builtin 為首的 Entity 類別。
Entity 規格定義相當詳細,可以協助開發自動產生資料新修刪表單,今天就先使用 EntityName 以及定義在類別的 DescriptionAttribute 的值,這個值可以在執行期由 entity.Table.Title 取出。
public string RenderEntities()
{
StringBuilder sb = new StringBuilder();
sb.Append("<ul class=\"dropdown-menu\">");
foreach(var entity in EntityCache.Values) {
// 略過 Kuick 內建的 Entity,
// 包含「資料庫組件」以及「內建服務組件」
bool skip = entity.GetType().Namespace.StartWith(
"Kuick.Data", "Kuick.Builtin"
);
if(skip) { continue; }
// 產生 Entity 連結
sb.AppendFormat(
"<li><a href=\"{0}\"><i class=\"icon-th-large\"></i>{1}</a></li>",
WebTools.BuildQueryString(
"~/entity/",
new Any("EntityName", entity.EntityName)
),
entity.Table.Title
);
}
sb.Append("<ul>");
return sb.ToString();
}