日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

5,ORM组件XCode(动手)

發(fā)布時(shí)間:2023/11/27 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5,ORM组件XCode(动手) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

??? 本篇才真正是XCode教程第一篇。《速覽》是為了以最簡(jiǎn)潔的語言最短小的篇幅去吸引開發(fā)者;《簡(jiǎn)介》則是對(duì)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)

中文名

英文名

數(shù)據(jù)類型

大小

是否主鍵

是否唯一

是否必填

默認(rèn)值

編號(hào)

ID

Int32

10

賬號(hào)

Account

String

50

?

?

?

顯示名

DisplayName

String

50

?

?

?

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

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

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

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

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

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

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

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

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

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

代碼 ///?<summary>
///?用戶
///?</summary>
[Serializable]
[DataObject]
[Description(
"用戶")]
[BindTable(
"UserMember",?Description?=?"用戶",?ConnName?=?"Test")]
public?partial?class?UserMember
{
????
#region?屬性
????
private?Int32?_ID;
????
///?<summary>
????
///?編號(hào)
????
///?</summary>
????[Description("編號(hào)")]
????[DataObjectField(
true,?true,?false,?10)]
????[BindColumn(
"ID",?Description?=?"編號(hào)",?DefaultValue?=?"",?Order?=?1)]
????
public?Int32?ID
????{
????????
get?{?return?_ID;?}
????????
set?{?if?(OnPropertyChange("ID",?value))?_ID?=?value;?}
????}
????
????
private?String?_Account;
????
///?<summary>
????
///?賬號(hào)
????
///?</summary>
????[Description("賬號(hào)")]
????[DataObjectField(
false,?false,?true,?50)]
????[BindColumn(
"Account",?Description?=?"賬號(hào)",?DefaultValue?=?"",?Order?=?2)]
????
public?String?Account
????{
????????
get?{?return?_Account;?}
????????
set?{?if?(OnPropertyChange("Account",?value))?_Account?=?value;?}
????}
????
????
private?String?_DisplayName;
????
///?<summary>
????
///?顯示名
????
///?</summary>
????[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?獲取/設(shè)置?字段值
????
///?<summary>
????
///?獲取/設(shè)置?字段值。
????
///?一個(gè)索引,基類使用反射實(shí)現(xiàn)。
????
///?派生實(shí)體類可重寫該索引,以避免反射帶來的性能損耗
????
///?</summary>
????
///?<param?name="name">字段名</param>
????
///?<returns></returns>
????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?字段名
????
///?<summary>
????
///?取得字段名的快捷方式
????
///?</summary>
????public?class?_
????{
????????
///?<summary>
????????
///?編號(hào)
????????
///?</summary>
????????public?const?String?ID?=?"ID";
????????
????????
///?<summary>
????????
///?賬號(hào)
????????
///?</summary>
????????public?const?String?Account?=?"Account";
????????
????????
///?<summary>
????????
///?顯示名
????????
///?</summary>
????????public?const?String?DisplayName?=?"DisplayName";
????}
????
#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)信息。

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

代碼 <?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>

?

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

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

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

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

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

可以看出,數(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里面去

再看看例子代碼

?

代碼 //新增數(shù)據(jù),Save等效于Insert
UserMember?user?=?new?UserMember();
user.Account?
=?"asdf";
user.Save();
//user.Insert();

//ID作為自增字段,保存后自動(dòng)設(shè)為新值
Console.WriteLine(user.ID);

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

user?
=?UserMember.FindByAccount("asdf");
user.DisplayName?
=?"測(cè)試數(shù)據(jù)";

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

//給成員賦值,等效
user.DisplayName?=?"測(cè)試數(shù)據(jù)";
user[
"DisplayName"]?=?"測(cè)試數(shù)據(jù)";

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

Console.WriteLine(user.ID);

user.Delete();

?

?

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

?

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

?

?

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

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

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

?

<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í)探測(cè)是哪一種數(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)行

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

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

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

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

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

?

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

?

?

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

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

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

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

添加一個(gè)用戶

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

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

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

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

?

?

大石頭

新生命開發(fā)團(tuán)隊(duì)

2010-09-07 03:57

轉(zhuǎn)載于:https://www.cnblogs.com/nnhy/archive/2010/09/15/1826602.html

總結(jié)

以上是生活随笔為你收集整理的5,ORM组件XCode(动手)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。