成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解ORM組件XCode教程 圖文并茂

移動(dòng)開發(fā) iOS
XCode開發(fā)模式建議先有數(shù)據(jù)庫再有實(shí)體模型,然后借助代碼生成器生成實(shí)體代碼;當(dāng)然你要反過來先做實(shí)體模型也是可以的,XCode之下的實(shí)體,支持反向生成數(shù)據(jù)庫結(jié)構(gòu)。

ORM組件XCode教程是本文要介紹的內(nèi)容,本篇才真正是XCode教程***篇。《速覽》是為了以最簡潔的語言最短小的篇幅去吸引開發(fā)者;《簡介》則是對XCode組件和XCode開發(fā)模式的一個(gè)整體介紹,讓開發(fā)者從宏觀的角度去理解XCode;《共舞》把XCode提到了一個(gè)新的高度,讓開發(fā)者感受到它的貴族血統(tǒng)!

先拋出三篇來吸引人,再出《動(dòng)手》,其實(shí)就是吊人胃口。如果到這里你還沒有想試一試XCode的念頭沖動(dòng),好吧,我承認(rèn)是我的失敗,不過你可以欺騙我,可別欺騙你自己!

XCode開發(fā)模式建議先有數(shù)據(jù)庫再有實(shí)體模型,然后借助代碼生成器生成實(shí)體代碼;當(dāng)然你要反過來先做實(shí)體模型也是可以的,XCode之下的實(shí)體,支持反向生成數(shù)據(jù)庫結(jié)構(gòu)。

下面以《速覽》中的UserMember為例,建立數(shù)據(jù)表:

數(shù)據(jù)表名: 用戶 (UserMember)

詳解ORM組件XCode教程 

詳解ORM組件XCode教程

數(shù)據(jù)庫命名規(guī)范:

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

(2)使用駝峰命名規(guī)則,每個(gè)單詞首字母大寫,其它小寫

(3)名稱必須簡潔明了,不要加多余的前綴(如表名前加tbl),字段名也不要加表名前綴

(4)不得使用SQL關(guān)鍵字或C#關(guān)鍵字作為表名或字段名

(5)布爾型字段名稱必須是IsAbb的形式

(6)字符串類型統(tǒng)一使用nvarchar,大文本使用ntext,除非特殊情況,否則不用其它文本類型

(7)建議給每張表建立一個(gè)自增的ID字段并作為主鍵,以利于數(shù)據(jù)分頁管理

(8)建議給每張表和每個(gè)字段加上說明

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

代碼

  1. /// <summary> 
  2. /// 用戶  
  3. /// </summary> 
  4. [Serializable]  
  5. [DataObject]  
  6. [Description("用戶")]  
  7. [BindTable("UserMember", Description = "用戶"ConnName = "Test")]  
  8. public partial class UserMember  
  9. {  
  10.     #region 屬性  
  11.     private Int32 _ID;  
  12.     /// <summary> 
  13.     /// 編號(hào)  
  14.     /// </summary> 
  15.     [Description("編號(hào)")]  
  16.     [DataObjectField(true, true, false, 10)]  
  17.     [BindColumn("ID", Description = "編號(hào)"DefaultValue = ""Order = 1)]  
  18.     public Int32 ID  
  19.     {  
  20.         get { return _ID; }  
  21.         set { if (OnPropertyChange("ID", value)) _ID = value; }  
  22.     }  
  23.       
  24.     private String _Account;  
  25.     /// <summary> 
  26.     /// 賬號(hào)  
  27.     /// </summary> 
  28.     [Description("賬號(hào)")]  
  29.     [DataObjectField(false, false, true, 50)]  
  30.     [BindColumn("Account", Description = "賬號(hào)"DefaultValue = ""Order = 2)]  
  31.     public String Account  
  32.     {  
  33.         get { return _Account; }  
  34.         set { if (OnPropertyChange("Account", value)) _Account = value; }  
  35.     }  
  36.       
  37.     private String _DisplayName;  
  38.     /// <summary> 
  39.     /// 顯示名  
  40.     /// </summary> 
  41.     [Description("顯示名")]  
  42.     [DataObjectField(false, false, true, 50)]  
  43.     [BindColumn("DisplayName", Description = "顯示名"DefaultValue = ""Order = 3)]  
  44.     public String DisplayName  
  45.     {  
  46.         get { return _DisplayName; }  
  47.         set { if (OnPropertyChange("DisplayName", value)) _DisplayName = value; }  
  48.     }  
  49.     #endregion  
  50.  
  51.     #region 獲取/設(shè)置 字段值  
  52.     /// <summary> 
  53.     /// 獲取/設(shè)置 字段值。  
  54.     /// 一個(gè)索引,基類使用反射實(shí)現(xiàn)。  
  55.     /// 派生實(shí)體類可重寫該索引,以避免反射帶來的性能損耗  
  56.     /// </summary> 
  57.     /// <param name="name">字段名</param> 
  58.     /// <returns></returns> 
  59.     public override Object this[String name]  
  60.     {  
  61.         get  
  62.         {  
  63.             switch (name)  
  64.             {  
  65.                 case "ID": return ID;  
  66.                 case "Account": return Account;  
  67.                 case "DisplayName": return DisplayName;  
  68.                 default: return base[name];  
  69.             }  
  70.         }  
  71.         set  
  72.         {  
  73.             switch (name)  
  74.             {  
  75.                 case "ID": _ID = Convert.ToInt32(value); break;  
  76.                 case "Account": _Account = Convert.ToString(value); break;  
  77.                 case "DisplayName": _DisplayName = Convert.ToString(value); break;  
  78.                 default: base[name] = value; break;  
  79.             }  
  80.         }  
  81.     }  
  82.     #endregion  
  83.     #region 字段名  
  84.     /// <summary> 
  85.     /// 取得字段名的快捷方式  
  86.     /// </summary> 
  87.     public class _  
  88.     {  
  89.         /// <summary> 
  90.         /// 編號(hào)  
  91.         /// </summary> 
  92.         public const String ID = "ID";  
  93.         /// <summary> 
  94.         /// 賬號(hào)  
  95.         /// </summary> 
  96.         public const String Account = "Account";  
  97.           
  98.         /// <summary> 
  99.         /// 顯示名  
  100.         /// </summary> 
  101.         public const String DisplayName = "DisplayName";  
  102.     }  
  103.     #endregion  

代碼不多,分為屬性、索引器和嵌套類三大塊,其中后兩塊還不是必須的,所以即使是手工編碼也不會(huì)太麻煩。

所使用的代碼生成器XCoder,是一個(gè)基于XCode的模版標(biāo)簽替換生成器。XCode提供數(shù)據(jù)庫結(jié)構(gòu)信息,用戶設(shè)計(jì)模版,XCoder根據(jù)模版標(biāo)簽進(jìn)行替換。上面的代碼還有數(shù)據(jù)字典表格,都是XCoder生成的,只是所使用的模版不同而已。有興趣的朋友完全可以定制自己的代碼生成器,DAL類的Tables屬性可以取得該連接的表架構(gòu)信息,如DAL.Create("Test").Tables可以取得連接名為Test的數(shù)據(jù)庫的架構(gòu)信息。

#p#

XCoder的使用很簡單,打開配置文件XCoder.exe.config,增加一個(gè)連接字符串

代碼

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <configuration> 
  3.   <connectionStrings> 
  4.     <add name="Test" connectionString="Data Source=.;Initial Catalog=Test;Integrated Security=True;" providerName="System.Data.SqlClient"/> 
  5.   </connectionStrings> 
  6. </configuration> 

運(yùn)行XCoder.exe,可以在連接下拉框選擇連接字符串

詳解ORM組件XCode教程

點(diǎn)擊連接,列出該庫所有表和視圖

ORM組件XCode教程

設(shè)置命名空間、輸出目錄和連接名等信息,選擇“數(shù)據(jù)”模版,點(diǎn)擊生成

ORM組件XCode教程

因?yàn)閄Code是充血模型,使用的時(shí)候是不需要指定數(shù)據(jù)庫連接的,所以實(shí)體類里面默認(rèn)指定連接名。

#p#

XCode模型追求簡單實(shí)用,所以沒有區(qū)分?jǐn)?shù)據(jù)層和業(yè)務(wù)層。但是XCode實(shí)體類有數(shù)據(jù)類和業(yè)務(wù)類的說法,剛才上面的“數(shù)據(jù)”模版生成的就是數(shù)據(jù)類,下面生成業(yè)務(wù)類

ORM組件XCode教程

可以看出,數(shù)據(jù)類和業(yè)務(wù)類其實(shí)就是同一類,只不過使用了分部類partial,把一個(gè)類分拆到兩個(gè)文件里面去。數(shù)據(jù)類記錄表結(jié)構(gòu)信息,基本上依靠于生成;業(yè)務(wù)類***次生成后只有一些注釋,用于引導(dǎo)開發(fā)者如何實(shí)現(xiàn)自己想要的功能。業(yè)務(wù)代碼等人工編寫的代碼,都要求卸載業(yè)務(wù)類里面,當(dāng)表結(jié)構(gòu)改變需要重新生成代碼時(shí),僅生成數(shù)據(jù)類即可,人工編寫的代碼保留在業(yè)務(wù)類中,不至于被覆蓋。

 

XCoder在輸出目錄生成了代碼文件,復(fù)制到vs里面去

ORM組件XCode教程  ORM組件XCode教程

再看看例子代碼

代碼

  1. //新增數(shù)據(jù),Save等效于Insert  
  2. UserMember user = new UserMember();  
  3. user.Account = "asdf";  
  4. user.Save();  
  5. //user.Insert();  
  6. //ID作為自增字段,保存后自動(dòng)設(shè)為新值  
  7. Console.WriteLine(user.ID);  
  8. //查找數(shù)據(jù),等效  
  9. user = UserMember.Find("Account", "asdf");  
  10. user = UserMember.Find(UserMember._.Account, "asdf");  
  11. user = UserMember.FindByAccount("asdf");  
  12. user.DisplayName = "測試數(shù)據(jù)";  
  13. //讀取成員數(shù)據(jù),等效  
  14. String str = (String)user["DisplayName"];  
  15. str = user.DisplayName;  
  16. //給成員賦值,等效  
  17. user.DisplayName = "測試數(shù)據(jù)";  
  18. user["DisplayName"] = "測試數(shù)據(jù)";  
  19. //保存數(shù)據(jù),等效  
  20. user.Save();  
  21. //user.Update();  
  22. Console.WriteLine(user.ID);  
  23. user.Delete(); 

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

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

這個(gè)方法是根據(jù)賬號(hào)查找用戶。一般建議,F(xiàn)indByXxxx表示根據(jù)某個(gè)條件查詢一個(gè)對象,F(xiàn)indAllByXxxx表示查詢符合某個(gè)條件的所有對象的集合。

再次編譯,通過。運(yùn)行

ORM組件XCode教程

又忘了,我們還沒有設(shè)置連接字符串呢。增加連接字符串

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

這里要求連接名必須是Test,因?yàn)樯蓴?shù)據(jù)類的時(shí)候,指定了連接名為Test,所以才有剛才的異常,提示設(shè)置Test連接字符串。后面就是標(biāo)準(zhǔn)的連接字符串了,當(dāng)然,這個(gè)時(shí)候是可以修改為Access、Oracle、MySql等連接字符串的,盡管我們開始的時(shí)候是在SqlServer中建立表結(jié)構(gòu)。因?yàn)閷?shí)體類已經(jīng)建立完成,它與具體數(shù)據(jù)庫無關(guān),只有在運(yùn)行時(shí)探測是哪一種數(shù)據(jù)庫,再根據(jù)情況生成相應(yīng)的查詢/操作SQL。

XCode除了能獲取數(shù)據(jù)庫架構(gòu)信息外,還能設(shè)置數(shù)據(jù)庫架構(gòu),也就是能夠根據(jù)實(shí)體類自動(dòng)進(jìn)行建表或者修改表結(jié)構(gòu)。所以,不用擔(dān)心修改連接字符串指向別的數(shù)據(jù)庫后,會(huì)因?yàn)闆]有數(shù)據(jù)表而報(bào)錯(cuò)。這個(gè)小功能有個(gè)好處,比如生產(chǎn)環(huán)境是Oracle數(shù)據(jù)庫,而開發(fā)環(huán)境比較差,跑不起Oracle,完全可以在開發(fā)環(huán)境用Access進(jìn)行設(shè)計(jì),部署到生成環(huán)境再修改連接字符串,XCode會(huì)盡其所能的屏蔽數(shù)據(jù)庫操作差異。

打開XCode的OrmDebug開關(guān)(用于輸出SQL語句),再次運(yùn)行

ORM組件XCode教程

跟上面的代碼進(jìn)行比對,可以加深理解。OrmDebug開關(guān)對于學(xué)習(xí)XCode和解決問題非常有用。

上面是控制臺(tái)的例子,下面看看Web的例子。

 #p#

在生成實(shí)體類代碼的時(shí)候,可以看到還有兩個(gè)模版“列表頁”和“表單”,取消“中文文件名”選擇,分別生成這兩個(gè)模版的代碼。新建一個(gè)網(wǎng)站,把它們復(fù)制進(jìn)去

ORM組件XCode教程  ORM組件XCode教程

設(shè)置連接字符串,預(yù)覽UserMember.aspx

ORM組件XCode教程

回到剛才的控制臺(tái)代碼,我們另外寫一段插入測試數(shù)據(jù)的代碼

  1. for (int i = 0; i < 176; i++)  
  2. {  
  3.     UserMember user = new UserMember();  
  4.     user.Account = "User" + i;  
  5.     user.DisplayName = "用戶" + i;  
  6.     user.Insert();  

這段代碼將會(huì)向數(shù)據(jù)庫插入176行數(shù)據(jù)。刷新UserMember.aspx頁面

ORM組件XCode教程  

ORM組件XCode教程  

ORM組件XCode教程  

ORM組件XCode教程  

ORM組件XCode教程

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

我們對這個(gè)頁面做一點(diǎn)修改,添加一個(gè)到UserMemberForm.aspx的鏈接,并且把GridView里面的賬號(hào)列改為超鏈接,也鏈接到UserMemberForm.aspx,并且?guī)螴D作為參數(shù)。 ORM組件XCode教程

ORM組件XCode教程

點(diǎn)擊“添加用戶”

ORM組件XCode教程  ORM組件XCode教程

添加一個(gè)用戶

ORM組件XCode教程

點(diǎn)擊賬號(hào)aaa,進(jìn)入表單編輯頁面,注意地址欄的ID=179

ORM組件XCode教程

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

其實(shí)這些都是一些非常簡單的功能,列表頁就是GridView+ObjectDataSource +實(shí)體類,表單頁就是FormView+ObjectDataSource+實(shí)體類,沒有傳遞ID的時(shí)候?yàn)樘砑訝顟B(tài)。

Web的例子就到這里,詳細(xì)的用法可以回過頭看看《與ObjectDataSource共舞》,里面提到的批量生產(chǎn)正是本篇所使用的代碼生成器生成列表頁和表單頁。

責(zé)任編輯:zhaolei 來源: 博客園
相關(guān)推薦

2011-08-09 16:47:24

Xcode 4發(fā)布程序

2011-11-21 15:12:54

Java斷點(diǎn)Eclipse

2011-01-18 18:29:28

Thunderbird

2011-07-20 12:49:49

XCode SnapShots SCM

2011-07-18 13:11:53

2012-07-27 10:27:19

OfficeWord

2011-07-04 16:57:36

QT 布局 界面

2009-07-15 14:49:16

2011-01-18 18:08:28

Thunderbird

2011-01-20 09:13:18

Postfix

2021-12-27 08:04:49

架構(gòu)網(wǎng)站高并發(fā)

2023-05-16 08:01:13

架構(gòu)網(wǎng)站演進(jìn)

2012-07-23 14:39:27

移動(dòng)

2011-01-19 17:34:39

Postfix如何接收郵件

2011-01-19 17:30:21

Postfix郵件投遞

2015-07-08 10:25:05

Javascript上下文作用域

2012-05-29 14:27:34

PHP

2022-04-20 18:30:00

算法架構(gòu)粗排

2011-01-21 10:28:06

2011-01-19 10:30:20

UbuntuThunderbird
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 午夜私人影院在线观看 | 欧美精品久久久久久久久老牛影院 | 久久婷婷色 | 羞羞在线视频 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 91看国产| 亚洲丝袜天堂 | 欧美久久久 | 中文在线视频 | 人人干人人干人人 | 成人免费视频在线观看 | 精品在线一区二区 | 国产欧美在线一区 | 久久九九影视 | 国产目拍亚洲精品99久久精品 | 99re6在线视频精品免费 | 成人在线视频观看 | 日韩综合在线 | 久久69精品久久久久久久电影好 | 亚洲欧美日韩系列 | 日韩免费av网站 | 日本不卡一区二区三区 | 亚洲欧美中文日韩在线v日本 | 久久精品国产亚洲 | 日本色高清 | 免费毛片网站 | 久热爱 | 精品久久久久久18免费网站 | 成人国内精品久久久久一区 | 亚洲国产激情 | 九九久久免费视频 | 99久久久无码国产精品 | 久久亚洲国产 | 看一级黄色毛片 | 国产精品揄拍一区二区 | 日韩午夜一区二区三区 | 国产视频观看 | 午夜久久久久久久久久一区二区 | 精品久久久久久 | 无码一区二区三区视频 | 欧美一区二区二区 |