想了解什么是XCode
在這里我不對XCode做過多介紹,XCode曾經是一個輕量級ORM組件,現在是一個重量級數據映射框架,支持實體對象數據到不同媒體的數據映射,提供面向對象的方式操作數據庫,解決90%以上的數據庫操作場景.是大石頭和他的NewLife團隊10年來的智慧結晶,感謝前人栽樹!
你可以用XCode生成Domain,做增、刪、改、查. 對於一個ORM我不要多強大,我只求簡單,好用,能查到我要的數據,能完成我要的操作,遇到問題能有人幫助.如果你的需求和我一樣,那么就停下來看看XCode的神奇之處吧!
想深入了解什么是XCode
請移步大石頭的博客
ORM組件XCode(速覽)
http://www.cnblogs.com/nnhy/archive/2010/09/12/1824349.html
ORM組件XCode(簡介)
http://www.cnblogs.com/nnhy/archive/2010/09/13/1824666.html
給第一次接觸XCode的人說的話
對於初學者,XCode看似給了一個很高的門檻,沒有完整的教程,沒有任何指導,有的只是源代碼和一些零碎的博文和高級應用,讓初學者無法入門,樓主也是才接觸XCode1個多月的新手,不敢說指教,只是想豐富一下XCode的入門教程,讓更多的人不會徘徊在門外不得入內.這也是樓主寫本文的初衷.至於能不能寫下去成為一個系列就看大家的反響吧.
正文開始!
第一次使用XCode的准備
對於第一次使用者來說,首先必要的就是提供所有的資源和材料,這點樓主第一次用XCode的時候就找了很久才把Dll和生成器下載下來,而且還不知道自己下載的是不是最新的.這里說明一下,XCode沒有完整版,穩定版之說,每天大石頭和他的NewLife團隊都在更新,每天源碼在ftp上編譯4次,找到適合自己的才是最重要的,群里有人都3個月沒更新dll了,照樣用的挺好.不要盲目追求最新版,或者你就是喜歡當小白鼠.
dll和工具下載地址請至:http://www.newlifex.com/showtopic-51.aspx
正式開始XCode之旅
1.新建一個工程
2.引用DLL
這里樓主又要多啰嗦了,其實也是對大家好,當你解壓完DLL壓縮包后,你會發現有很多DLL,這些DLL到底是干什么的呢,我應該引用哪個呢?
DLL里面其實是NewLife團隊的所有組件,如果只是用ORM框架的話只需要用到下面提到的DLL,其他的DLL的作用其實樓主也不是很明白,樓主也不在這里誤導大家.
NewLife.Core.dll NewLife核心代碼,XCode也需要引用
XCode.dll XCode代碼
所以引用DLL就是主要用這2個DLL,同名的XML文件一起復制進去,作用是智能提示的時候能夠顯示注釋內容,同名的pdb文件是調試文件,在報錯的時候能指示該錯誤發生在第幾行,用於向大石頭和他的團隊求助時讓他們定位到錯誤發生的精確位置.
3.數據庫建立
XCode強大之處,不僅僅是可以從數據庫導出Domain,更強大的是可以根據連接字段反向生成數據庫,這么說可能沒想到有什么用,換句話說就是,你可以用SQL2K開發,然后部署的時候直接帶上你的程序部署,XCode會自動幫你根據連接字段生成數據庫,你可以直接部署到MySQL,SQL2005里,不需要改代碼,不要備份數據庫.當然XCode這時只是生成了一個數據庫表,並沒有數據,初始化菜單和管理員這些數據XCode也支持,但不是本節我們討論的內容.這些在以后有機會再介紹.(該功能需要配config,默認該功能關閉)
這里我們講的是如何從數據庫導出Domain,為我們所用.
我們先新建一個數據庫,叫XCodeTest,這里為了方便講解,我們用最經典的,學生-科目-教師-成績表來示范
建立一個Student表,設置ID為主鍵,自增
建立一個Subject表,設置ID為主鍵,自增
關聯TeacherID,一個科目由一個老師來負責,一個老師可以負責多個科目
建立一個Teacher表,設置ID為主鍵,自增
建立一個成績表,ID主鍵,自增
關聯SubjectID和StudentID
在建立數據庫的時候,我一再強調ID主鍵,自增,是因為XCode對自增主鍵支持比較好,在Save方法內部,通過判斷ID是否為空來選擇Insert或Update,同樣你可以用Guid做主鍵,但那樣使用就不方便了,你要自己控制Insert還是Update
4.代碼生成器
終於輪到代碼生成器了,說實話,樓主自己第一次用代碼生成器的時候就不知道怎么用.
在打開代碼生成器之前,我們要配置一下連接字符串,解壓到的文件中,有XCode.exe.config,打開他編輯,可以看到已經有了很多連接字段,都是示例,我們是SQL就復制一條mssql的來改吧
<add name="XCodeTest" connectionString="Server=(local);User id=sa;Pwd=sa;Database=XCodeTest" providerName="System.Data.SqlClient"/>
改好后,保存關閉.
打開代碼生成器,看到我們剛才寫的連接字符串已經被讀到了
然后點連接,可以看到我們的表都已經讀取到了
接下來改一改連接名,命名空間,輸出目錄
然后是生成,選則好模版,點擊生成所有表,模版只要選擇實體業務和實體數據2項就可以了,選一次模版,點一次生成所有表,再選一次模版,再點一次生成所有表!
關掉代碼生成器,回到我們的項目來,新建一個文件夾Domain, 右鍵文件夾,添加---現有項, 把剛才生成文件都添加進來
5.從登錄開始
拖2個TextBox,一個Button就可以開始了.用戶名:<asp:TextBox ID="txtUserName" runat="server"></asp:TextBox> <br /> 密 碼:<asp:TextBox ID="txtPsw" runat="server" TextMode="Password"></asp:TextBox> <br /> <asp:Button ID="btnLogin" runat="server" Text="Button" />
然后就是登錄按鈕的單擊事件,這里插一段:在這個業務里,我們需要根據用戶名查找用戶,看一下跟Student有關的2個文件,一個叫Student.cs 一個叫Student.Biz.cs在進去仔細看一看(PS,我的Windows Live Writer的代碼着色插件好像沒有用嘛~~~不知道發送出去會不會着色)public partial class Student : IStudent { } public partial class Student : Entity<Student> { }
這里可以看到partial這個屬性,部分的,所以我們的Student類可以寫在多個文件中,這樣我們就利用這個特性,新建一個Student.My.cs
報錯了,別着急,改一改,這樣就可以了,所有我們自己新增和修改的代碼都寫在這個文件里,這樣的話,如果我們數據庫結構改變了,重新生成實體和業務只要覆蓋那2個文件就可以了,我們自己編寫的代碼完全不受影響,之前樓主直接把代碼寫在Biz.cs里,后來數據庫一改,每次替換的時候都提心吊膽的,生怕覆蓋了自己寫的代碼.
接下來繼續我們的業務,要根據用戶名查找用戶,XCode生成的Biz.cs文件里已經有了一些常用的方法了,可以去看一看,包括一些高級的方法,也被注釋掉了,可以照着改,
/// <summary>根據Name查找</summary> /// <param name="id"></param> /// <returns></returns> public static Student FindByUserName(string userName) { if (Meta.Count >= 1000) return Find(_.Name, userName); else // 實體緩存 return Meta.Cache.Entities.Find(_.Name, userName); // 單對象緩存 //return Meta.SingleCache[id]; }
這里有必要解釋下代碼,Meta.Count這里判斷表內數據是否超過1000,如果沒超過1000的話用實體緩存來獲取數據,這比較適合象菜單,權限這樣的表,內容固定且不多,直接從緩存中獲取,效率極高,如果超過1000條那從內存中找效率和數據庫中找其實優勢就不大了,所以直接從數據庫中找.
接下來回到頁面的登錄按鈕單擊事件
protected void btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text.Trim(); string psw = txtPsw.Text.Trim(); Student student = Student.FindByUserName(userName); if(student != null) { //這里密碼就不做md5加密處理了,真實應用中一定要加密,切勿重蹈csdn覆轍 if(psw == student.Psw) { //登錄成功跳轉 Response.Redirect("Welcome.aspx"); } } Response.Write("用戶名或密碼錯誤!!!"); }
建立一個Welcome.aspx的文件,里面就寫一句"登錄成功"吧~~~登錄成功后保存用戶狀態不在本節討論范圍內!各位看官自行處理~~
為了演示,我們到數據庫里加1個用戶吧~編譯執行~~結果...報錯了...
仔細一看,原來是XCode自作聰明,發現我們Subject表里有TeacherID,於是就關聯到了Teacher表中的ID,然后生成了一大堆擴展屬性,
最要命的是還連續生成了2份,導致了錯誤,只要錯誤是出在Biz.cs中的,只管刪,有能力的可以仔細分析錯誤,把多余的內容刪除掉,其實XCode是好心做壞事了
在這里我把帶紅線的上上下下都刪除了!
結果又出了一個錯~~
好吧,我承認我錯了,我不該把表命名為Score,然后里面又有Score這個屬性,結果就是這個類叫Score,里面還有個Score的屬性,這個好辦,把屬性Score改成MySCore
![]()
再編譯下,繼續報錯,
編譯~~~通過了 (PS:在這里,樓主把出的錯也寫上來,怎么解決的也一並寫上來,給大家參考下吧...遇到報錯不要急,看錯誤提示,其實很好解決,實在不行問度娘)
一輸入帳號和密碼,點確定,,,結果又報錯了
![]()
哦~~~~MyGod,為什么我又忘記配置Web.Config的連接字段了~~~~這里可以看到,請設置XCodeTest連接字符串,所以我們的連接字段名稱必須是XCodeTest,這個當然是我們在用代碼生成器的時候生成的咯....其實大家也可以在Student.cs頂上的屬性聲明中看到里面聲明了連接字段名.
結束程序,打開web.config<connectionStrings> <add name="XCodeTest" connectionString="Server=(local);User id=sa;Pwd=sa;Database=XCodeTest" providerName="System.Data.SqlClient"/> </connectionStrings>
把連接字段配置好,再跑一次~~
![]()
當我看到這個的時候,我就知道成功了.~~再輸錯一次密碼試試~~![]()
嘿嘿~~成功了~~下一節我們來示范成績表的操作~~~
本文的Demo下載地址:
http://dl.dbank.com/c0m64ioz5r
NewLife論壇地址:
大石頭博客:
NewLife.XCode開發資源目錄
http://www.cnblogs.com/asxinyu/archive/2012/06/02/2532210.html