<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      5,ORM組件XCode(動(dòng)手)

          本篇才真正是XCode教程第一篇。《速覽》是為了以最簡(jiǎn)潔的語(yǔ)言最短小的篇幅去吸引開發(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ù)庫(kù)再有實(shí)體模型,然后借助代碼生成器生成實(shí)體代碼;當(dāng)然你要反過來先做實(shí)體模型也是可以的,XCode之下的實(shí)體,支持反向生成數(shù)據(jù)庫(kù)結(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

       

       

       

      wps_clip_image-26120

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

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

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

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

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

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

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

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

      建議給每張表和每個(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(
      truetruefalse10)]
          [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(
      falsefalsetrue50)]
          [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(
      falsefalsetrue50)]
          [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;
                      
      defaultreturn 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;
                      
      defaultbase[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ù)庫(kù)結(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ù)庫(kù)的架構(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,可以在連接下拉框選擇連接字符串

      wps_clip_image-4220

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

      wps_clip_image-15353

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

      wps_clip_image-19110

      因?yàn)閄Code是充血模型,使用的時(shí)候是不需要指定數(shù)據(jù)庫(kù)連接的,所以實(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ù)類

      wps_clip_image-30238

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

      wps_clip_image-3181wps_clip_image-25038

      再看看例子代碼

       

      代碼
      //新增數(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)查找用戶。一般建議,F(xiàn)indByXxxx表示根據(jù)某個(gè)條件查詢一個(gè)對(duì)象,F(xiàn)indAllByXxxx表示查詢符合某個(gè)條件的所有對(duì)象的集合。

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

      wps_clip_image-12655

      又忘了,我們還沒有設(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ù)庫(kù)無關(guān),只有在運(yùn)行時(shí)探測(cè)是哪一種數(shù)據(jù)庫(kù),再根據(jù)情況生成相應(yīng)的查詢/操作SQL。

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

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

      wps_clip_image-18734

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

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

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

      wps_clip_image-19515wps_clip_image-2470

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

      wps_clip_image-19811

      回到剛才的控制臺(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ù)庫(kù)插入176行數(shù)據(jù)。刷新UserMember.aspx頁(yè)面

      wps_clip_image-24351

      wps_clip_image-24647wps_clip_image-4652

      wps_clip_image-4881

      wps_clip_image-26768

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

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

      wps_clip_image-19387

      wps_clip_image-29363

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

      wps_clip_image-23060wps_clip_image-26119

      添加一個(gè)用戶

      wps_clip_image-14110

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

      wps_clip_image-29559

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

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

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

       

       

      大石頭

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

      2010-09-07 03:57

      posted @ 2010-09-15 07:42  大石頭  閱讀(5631)  評(píng)論(6)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲精品理论电影在线观看| 97se亚洲综合在线天天| 大悟县| 视频一区视频二区卡通动漫| 国产成人亚洲综合91精品| 午夜DY888国产精品影院| 国产精品国产三级国快看| 色成人亚洲| 成人国产精品日本在线观看| 男女啪啪永久免费观看网站| 四虎永久在线精品8848a| 国产精品天天看天天狠| 欧美日韩一区二区三区视频播放| 日韩中文字幕综合第二页| 久久精品国产精品第一区| 日本一区二区三区四区黄色| 欧美成人精品三级网站| 国产成人精品一区二区三| 午夜爽爽爽男女污污污网站| 国产不卡精品视频男人的天堂 | 亚洲精品无码成人A片九色播放| 人妻无码中文字幕免费视频蜜桃| 国产亚洲一本大道中文在线| 97久久综合亚洲色hezyo| 俺也来俺也去俺也射| 成人自拍小视频免费观看| 亚洲精品一区二区毛豆| 五级黄高潮片90分钟视频| 熟妇的味道hd中文字幕| 亚洲av无码乱码在线观看野外| 国产精品va在线观看无码| 亚洲一区二区色情苍井空 | 国产很色很黄很大爽的视频| 刚察县| 日本一码二码三码的区分| 又爽又黄又无遮掩的免费视频| 沿河| 亚洲精品国产精品国在线| 久久月本道色综合久久| 宁都县| 人人妻人人狠人人爽|