5,ORM組件XCode(動手)

    本篇才真正是XCode教程第一篇。《速覽》是爲了以最簡潔的語言最短小的篇幅去吸引開發者;《簡介》則是對XCode組件和XCode開發模式的一個總體介紹,讓開發者從宏觀的角度去理解XCode;《共舞》把XCode提到了一個新的高度,讓開發者感覺到它的貴族血統! html

    先拋出三篇來吸引人,再出《動手》,其實就是吊人胃口。若是到這裏你尚未想試一試XCode的念頭衝動,好吧,我認可是個人失敗,不過你能夠欺騙我,可別欺騙你本身! 數據庫

 

    XCode開發模式建議先有數據庫再有實體模型,而後藉助代碼生成器生成實體代碼;固然你要反過來先作實體模型也是能夠的,XCode之下的實體,支持反向生成數據庫結構。 架構

下面以《速覽》中的UserMember爲例,創建數據表: ide

數據表名: 用戶 (UserMember) 性能

中文名學習

英文名測試

數據類型網站

大小this

是否主鍵編碼

是否惟一

是否必填

默認值

編號

ID

Int32

10

帳號

Account

String

50

 

 

 

顯示名

DisplayName

String

50

 

 

 

wps_clip_image-26120

數據庫命名規範:

² 名稱必須使用通俗易懂的英文單詞全拼,經常使用的縮略詞(如ID)除外

² 使用駝峯命名規則,每一個單詞首字母大寫,其它小寫

² 名稱必須簡潔明瞭,不要加多餘的前綴(如表名前加tbl),字段名也不要加表名前綴

² 不得使用SQL關鍵字或C#關鍵字做爲表名或字段名

² 布爾型字段名稱必須是IsAbb的形式

² 字符串類型統一使用nvarchar,大文本使用ntext,除非特殊狀況,不然不用其它文本類型

² 建議給每張表創建一個自增的ID字段並做爲主鍵,以利於數據分頁管理

² 建議給每張表和每一個字段加上說明

使用代碼生成器生成代碼(先看代碼,待會講過程):

代碼
///  
///  用戶
///  
[Serializable]
[DataObject]
[Description(
" 用戶 " )]
[BindTable(
" UserMember " , Description  =   " 用戶 " , ConnName  =   " Test " )]
public   partial   class  UserMember
{
    
#region  屬性
    
private  Int32 _ID;
    
///  
    
///  編號
    
///  
    [Description( " 編號 " )]
    [DataObjectField(
true true false 10 )]
    [BindColumn(
" ID " , Description  =   " 編號 " , DefaultValue  =   "" , Order  =   1 )]
    
public  Int32 ID
    {
        
get  {  return  _ID; }
        
set  {  if  (OnPropertyChange( " ID " , value)) _ID  =  value; }
    }
    
    
private  String _Account;
    
///  
    
///  帳號
    
///  
    [Description( " 帳號 " )]
    [DataObjectField(
false false true 50 )]
    [BindColumn(
" Account " , Description  =   " 帳號 " , DefaultValue  =   "" , Order  =   2 )]
    
public  String Account
    {
        
get  {  return  _Account; }
        
set  {  if  (OnPropertyChange( " Account " , value)) _Account  =  value; }
    }
    
    
private  String _DisplayName;
    
///  
    
///  顯示名
    
///  
    [Description( " 顯示名 " )]
    [DataObjectField(
false false true 50 )]
    [BindColumn(
" DisplayName " , Description  =   " 顯示名 " , DefaultValue  =   "" , Order  =   3 )]
    
public  String DisplayName
    {
        
get  {  return  _DisplayName; }
        
set  {  if  (OnPropertyChange( " DisplayName " , value)) _DisplayName  =  value; }
    }
    
#endregion

    
#region  獲取/設置 字段值
    
///  
    
///  獲取/設置 字段值。
    
///  一個索引,基類使用反射實現。
    
///  派生實體類可重寫該索引,以免反射帶來的性能損耗
    
///  
    
///   字段名
    
///  
     public   override  Object  this [String name]
    {
        
get
        {
            
switch  (name)
            {
                
case   " ID " return  ID;
                
case   " Account " return  Account;
                
case   " DisplayName " return  DisplayName;
                
default return   base [name];
            }
        }
        
set
        {
            
switch  (name)
            {
                
case   " ID " : _ID  =  Convert.ToInt32(value);  break ;
                
case   " Account " : _Account  =  Convert.ToString(value);  break ;
                
case   " DisplayName " : _DisplayName  =  Convert.ToString(value);  break ;
                
default base [name]  =  value;  break ;
            }
        }
    }
    
#endregion

    
#region  字段名
    
///  
    
///  取得字段名的快捷方式
    
///  
     public   class  _
    {
        
///  
        
///  編號
        
///  
         public   const  String ID  =   " ID " ;
        
        
///  
        
///  帳號
        
///  
         public   const  String Account  =   " Account " ;
        
        
///  
        
///  顯示名
        
///  
         public   const  String DisplayName  =   " DisplayName " ;
    }
    
#endregion
}

 

    代碼很少,分爲屬性、索引器和嵌套類三大塊,其中後兩塊還不是必須的,因此即便是手工編碼也不會太麻煩。

    所使用的代碼生成器XCoder,是一個基於XCode的模版標籤替換生成器。XCode提供數據庫結構信息,用戶設計模版,XCoder根據模版標籤進行替換。上面的代碼還有數據字典表格,都是XCoder生成的,只是所使用的模版不一樣而已。有興趣的朋友徹底能夠定製本身的代碼生成器,DAL類的Tables屬性能夠取得該鏈接的表架構信息,如DAL.Create("Test").Tables能夠取得鏈接名爲Test的數據庫的架構信息。

    XCoder的使用很簡單,打開配置文件XCoder.exe.config,增長一個鏈接字符串:

代碼
xml version="1.0" encoding="utf-8" ?>
<configuration>
  
<connectionStrings>
    
<add name="Test" connectionString="Data Source=.;Initial Catalog=Test;Integrated Security=True;" providerName="System.Data.SqlClient"/>
  
connectionStrings>
configuration>

 

運行XCoder.exe,能夠在鏈接下拉框選擇鏈接字符串

wps_clip_image-4220

點擊鏈接,列出該庫全部表和視圖

wps_clip_image-15353

設置命名空間、輸出目錄和鏈接名等信息,選擇「數據」模版,點擊生成

wps_clip_image-19110

由於XCode是充血模型,使用的時候是不須要指定數據庫鏈接的,因此實體類裏面默認指定鏈接名。

XCode模型追求簡單實用,因此沒有區分數據層和業務層。可是XCode實體類有數據類和業務類的說法,剛纔上面的「數據」模版生成的就是數據類,下面生成業務類

wps_clip_image-30238

能夠看出,數據類和業務類其實就是同一類,只不過使用了分部類partial,把一個類分拆到兩個文件裏面去。數據類記錄表結構信息,基本上依靠於生成;業務類第一次生成後只有一些註釋,用於引導開發者如何實現本身想要的功能。業務代碼等人工編寫的代碼,都要求卸載業務類裏面,當表結構改變須要從新生成代碼時,僅生成數據類便可,人工編寫的代碼保留在業務類中,不至於被覆蓋。

XCoder在輸出目錄生成了代碼文件,複製到vs裏面去

wps_clip_image-3181wps_clip_image-25038

再看看例子代碼

 

代碼
// 新增數據,Save等效於Insert
UserMember user  =   new  UserMember();
user.Account 
=   " asdf " ;
user.Save();
// user.Insert();

// ID做爲自增字段,保存後自動設爲新值
Console.WriteLine(user.ID);

// 查找數據,等效
user  =  UserMember.Find( " Account " " asdf " );
user 
=  UserMember.Find(UserMember._.Account,  " asdf " );

user 
=  UserMember.FindByAccount( " asdf " );
user.DisplayName 
=   " 測試數據 " ;

// 讀取成員數據,等效
String str  =  (String)user[ " DisplayName " ];
str 
=  user.DisplayName;

// 給成員賦值,等效
user.DisplayName  =   " 測試數據 " ;
user[
" DisplayName " =   " 測試數據 " ;

// 保存數據,等效
user.Save();
// user.Update();

Console.WriteLine(user.ID);

user.Delete();

 

 

編譯,提示user = UserMember.FindByAccount("asdf")這句報錯,沒有FindByAccout方法。忘了這是我手工寫的了

 

public   static  UserMember FindByAccount(String account)
{
    
return  Find(_.Account, account);
}

 

 

這個方法是根據帳號查找用戶。通常建議,FindByXxxx表示根據某個條件查詢一個對象,FindAllByXxxx表示查詢符合某個條件的全部對象的集合。

再次編譯,經過。運行

wps_clip_image-12655

又忘了,咱們尚未設置鏈接字符串呢。增長鏈接字符串

 

< add  name ="Test"  connectionString ="Data Source=.;Initial Catalog=Test;Integrated Security=True;"  providerName ="System.Data.SqlClient"   />

 

 

這裏要求鏈接名必須是Test,由於生成數據類的時候,指定了鏈接名爲Test,因此纔有剛纔的異常,提示設置Test鏈接字符串。後面就是標準的鏈接字符串了,固然,這個時候是能夠修改成Access、Oracle、MySql等鏈接字符串的,儘管咱們開始的時候是在SqlServer中創建表結構。由於實體類已經創建完成,它與具體數據庫無關,只有在運行時探測是哪種數據庫,再根據狀況生成相應的查詢/操做SQL。

XCode除了能獲取數據庫架構信息外,還能設置數據庫架構,也就是可以根據實體類自動進行建表或者修改表結構。因此,不用擔憂修改鏈接字符串指向別的數據庫後,會由於沒有數據表而報錯。這個小功能有個好處,好比生產環境是Oracle數據庫,而開發環境比較差,跑不起Oracle,徹底能夠在開發環境用Access進行設計,部署到生成環境再修改鏈接字符串,XCode會盡其所能的屏蔽數據庫操做差別。

打開XCode的OrmDebug開關(用於輸出SQL語句),再次運行

wps_clip_image-18734

跟上面的代碼進行比對,能夠加深理解。OrmDebug開關對於學習XCode和解決問題很是有用。

上面是控制檯的例子,下面看看Web的例子。

在生成實體類代碼的時候,能夠看到還有兩個模版「列表頁」和「表單」,取消「中文文件名」選擇,分別生成這兩個模版的代碼。新建一個網站,把它們複製進去

wps_clip_image-19515wps_clip_image-2470

設置鏈接字符串,預覽UserMember.aspx

wps_clip_image-19811

回到剛纔的控制檯代碼,咱們另外寫一段插入測試數據的代碼

 

for  ( int  i  =   0 ; i  <   176 ; i ++ )
{
    UserMember user 
=   new  UserMember();
    user.Account 
=   " User "   +  i;
    user.DisplayName 
=   " 用戶 "   +  i;
    user.Insert();
}

 

 

這段代碼將會向數據庫插入176行數據。刷新UserMember.aspx頁面

wps_clip_image-24351

wps_clip_image-24647wps_clip_image-4652

wps_clip_image-4881

wps_clip_image-26768

列表顯示、分頁、排序、編輯、刪除等功能都有了。

咱們對這個頁面作一點修改,添加一個到UserMemberForm.aspx的連接,而且把GridView裏面的帳號列改成超連接,也連接到UserMemberForm.aspx,而且帶上ID做爲參數。

wps_clip_image-19387

wps_clip_image-29363

點擊「添加用戶」

wps_clip_image-23060wps_clip_image-26119

添加一個用戶

wps_clip_image-14110

點擊帳號aaa,進入表單編輯頁面,注意地址欄的ID=179

wps_clip_image-29559

又一次,咱們沒有編寫代碼!

其實這些都是一些很是簡單的功能,列表頁就是GridView+ObjectDataSource +實體類,表單頁就是FormView+ObjectDataSource+實體類,沒有傳遞ID的時候爲添加狀態。

Web的例子就到這裏,詳細的用法能夠回過頭看看《與ObjectDataSource共舞》,裏面提到的批量生產正是本篇所使用的代碼生成器生成列表頁和表單頁。

 

 

大石頭

新生命開發團隊

2010-09-07 03:57

做者: 大石頭 發表於 2010-09-15 07:42 原文連接

評論: 6 查看評論 發表評論

最新新聞:
· 是否該讓開發人員跟客戶直接交流?(2010-12-21 07:53)
· 亞馬遜副總裁跳槽Groupon任CFO(2010-12-21 07:50)
· Gmail語音服務將延長至2011年末(2010-12-21 07:49)
· AOL收購我的檔案網站About.me(2010-12-21 07:48)
· AT&T 19.25億美圓購入高通 700MHz 低頻頻譜(2010-12-21 07:42)

編輯推薦:Mono又更新了

網站導航:博客園首頁

相關文章
相關標籤/搜索