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

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

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

      DotNetFresh

      博客園 首頁 新隨筆 聯系 訂閱 管理

          前段時間下載了castle的active record(AR)進行試用,通過幾天的研究使用,有些心得,現進行一下整理,將所學,所得,所惑都理一下,以待在以后能更好的學習研究.
          本文主要內容:Castle-AR的基本使用,通過一個小小的例子,做到能熟練的使用AR,對AR有一個感性的認識,在以后空余時間能對其進行深入的研究,學習.
          話不多說,進入主題,ORM的概念博客園上已經介紹得很多,這里就不再提及.先介紹一下例子,這是我自己想的一個環境,包括如下對象:Blog(博客),Post(隨筆),PostType(隨筆類型),Community(社區),之所以虛構這幾個對象,主要是想考察AR對各種關系的表現能力,和處理容易度,而這幾個對象之間可以包括數據庫中常見的一對多(Blog和Post的關系),多對一(Post和PostType的關系),多對多的關系(Blog和Community的關系),一對一的關系暫不考慮.庫的結構如下圖所示:

      生成數據庫的腳本如下:

      #region Sql
      CREATE TABLE [dbo].[Blog] (
          [BlogId] [
      int] IDENTITY (11) NOT NULL ,
          [BlogName] [varchar] (
      50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
          [BlogIntro] [varchar] (
      100) COLLATE Chinese_PRC_CI_AS NULL ,
          [Email] [varchar] (
      50) COLLATE Chinese_PRC_CI_AS NULL ,
          [RegistTime] [datetime] NULL 
      ) ON [PRIMARY]
      GO

      CREATE TABLE [dbo].[Blog_Community] (
          [BlogId] [
      int] NOT NULL ,
          [CommunityId] [
      int] NOT NULL 
      ) ON [PRIMARY]
      GO

      CREATE TABLE [dbo].[Community] (
          [CommunityId] [
      int] IDENTITY (11) NOT NULL ,
          [CommunityName] [varchar] (
      50) COLLATE Chinese_PRC_CI_AS NULL ,
          [CommunityIntro] [varchar] (
      500) COLLATE Chinese_PRC_CI_AS NULL 
      ) ON [PRIMARY]
      GO

      CREATE TABLE [dbo].[Post] (
          [PostId] [
      int] IDENTITY (11) NOT NULL ,
          [PostTypeId] [
      int] NULL ,
          [BlogId] [
      int] NULL ,
          [PostName] [varchar] (
      50) COLLATE Chinese_PRC_CI_AS NULL ,
          [PostContext] [varchar] (
      500) COLLATE Chinese_PRC_CI_AS NULL ,
          [PostTime] [datetime] NULL ,
          [IsPost] [
      char] (10) COLLATE Chinese_PRC_CI_AS NULL 
      ) ON [PRIMARY]
      GO

      CREATE TABLE [dbo].[PostType] (
          [PostTypeId] [
      int] IDENTITY (11) NOT NULL ,
          [PostTypeName] [varchar] (
      50) COLLATE Chinese_PRC_CI_AS NULL 
      ) ON [PRIMARY]
      GO
      #endregion
      OK,環境搭好了.現在進入我們最關心的部分

      1.AR 之 一對多.
      在該例子中Blog與Post之間的關系是一對多的.現在我們先來介紹一下由AR Generator自動生成的代碼
      [ActiveRecord("Blog")]
      public class Blog : ActiveRecordBase
      {}
      ActiveRecord特性表明該實體類與數據庫中的哪張表對應.凡是要通過AR與庫中的表進行映射的實體類必須繼承ActiveRecordBase類.

      [PrimaryKey(PrimaryKeyType.Native)]
              
      public int BlogId
              
      {
                  
      get
                  
      {
                      
      return this.blogId;
                  }

                  
      set
                  
      {
                      
      this.blogId = value;
                  }

              }
      這個地球人一看就明白了吧:)這里因為我屬性的名稱與庫中的字段名稱是一樣的,所以,不用將該屬性映射的字段寫出來.非主鍵的屬性可以通過[Property()]特性描述.(怎么樣?是不是覺得比Nhibernate的映射文件要簡單了許多啊?)

      現在到了關鍵,我們的一對多關系:
      [HasMany(typeof(Post), Table="Post", ColumnKey="BlogId")]
              
      public System.Collections.IList Posts
              
      {
                  
      get
                  
      {
                      
      return this.posts;
                  }

                  
      set
                  
      {
                      
      this.posts = value;
                  }

              }

      AR采用HasMany來描述這種關系,后面參數的名稱想必一看便知,Post是"多"的表名,BlogId是該表的主建.
      好,我們再來看看Post類中的關鍵映射代碼:

      [BelongsTo("BlogId")]
              
      public Blog Blog
              
      {
                  
      get
                  
      {
                      
      return this.blog;
                  }

                  
      set
                  
      {
                      
      this.blog = value;
                  }

              }

      是不是同樣簡單呢?

      2.AR 之 多對一.
      (這就不多講了,只是HasMany和BelongsTo放的地方不同,關注的方向不同而已,用法都一樣)

      3.AR之 多對多.
      在這個例子中,Blog和Community是多對多的關系.在我們一般的設計中,一般會把多對多的兩個表拆成三個表,在這里,我加入了一個表Blog_Community.(該表不需要在AR中進行映射,AR會自動幫你完成相關操作).我們先看一下Blog里面的關鍵代碼:

      [HasAndBelongsToMany(typeof(Community), Table="Blog_Community",ColumnRef="CommunityId", ColumnKey="BlogId")]
              
      public System.Collections.IList Community
              
      {
                  
      get
                  
      {
                      
      return this.community;
                  }

                  
      set
                  
      {
                      
      this.community = value;
                  }

              }
      AR使用HasAndBelongsToMany來表示多對多的關系.其他參數我想各位一看便知道,不多費話.再看看Community里面的關鍵代碼:
      [HasAndBelongsToMany(typeof(Blog), Table="Blog_Community",ColumnRef="BlogId", ColumnKey="CommunityId")]
              
      public System.Collections.IList Blog
              
      {
                  
      get
                  
      {
                      
      return this.blog;
                  }

                  
      set
                  
      {
                      
      this.blog = value;
                  }

              }
      OK.這就完成了AR中的多對多的映射關系.(注意一點:我在生成各實體類的代碼的時候,是使用的AR帶的一個AR Generator,在將Blog表選進去的時候,他把Blog_Community和Community表都導進去了,從而生成的是一個一對多的關系和一個多對一個關系,所以后來我手動修改的代碼添加了HasAndBelongsToMany的特性,不知道這是否是AR Generetor的一個BUG).

      OK.這三種關系的映射就先介紹到這,以下是我寫的一些測試代碼.感興趣的可以瞄兩眼.
      [Test]
              
      public void TestBlogCRUD()
              
      {
                  Blog b 
      = new Blog();
                  b.BlogName 
      = "DotNetFresh";
                  b.BlogIntro 
      = "StudyDotNet";
                  b.Email 
      = "hello@163.com";
                  b.RegistTime 
      = DateTime.Now;
                  b.Create();  
      //C

                  b.BlogIntro 
      = "Good good study,day day up";
                  b.Update(); 
      //U

                  Blog bb 
      = Blog.Find(b.BlogId); //R
                  bb.Delete(); //D
                  
              }
      [Test]
              
      public void TestAddBlogWithPostAndPostType()
              
      {
                  
      //新建一個Blog
                  Blog b = new Blog();
                  b.BlogName 
      = "withpost";
                  b.BlogIntro 
      = "i'm have post already";
                  b.Email 
      = "hello@163.com";
                  b.RegistTime 
      = DateTime.Now;

                  
      //新建一個PostType
                  PostType type = new PostType();
                  type.PostTypeName 
      = "new type";
                  
                  
      //新建一個Post
                  Post p = new Post();
                  p.Blog 
      = b;
                  p.PostType 
      = type;
                  p.PostName 
      = "new post";
                  p.PostTime 
      = DateTime.Now;

                  
      //執行事務,將上面三個對象持久化到數據庫
                  using(TransactionScope transaction = new TransactionScope())
                  
      {
                      
      try
                      
      {
                          b.Create();
                          type.Create();
                          p.Create();
                      }

                      
      catch
                      
      {
                          transaction.VoteRollBack();
                      }

                  }

              }


              [Test]
              
      public void TestAddBlogWithCommunity()
              
      {
                  
      //新建一個Blog
                  Blog b = new Blog();
                  b.BlogName 
      = "withcommunity";
                  b.BlogIntro 
      = "i'm in a community already";
                  b.Email 
      = "hello@163.com";
                  b.RegistTime 
      = DateTime.Now;

                  
      //該Blog屬于的社區
                  ArrayList al = new ArrayList();
                  al.Add(Community.Find(
      3));
                  al.Add(Community.Find(
      4));
                  b.Community 
      = al;

                  b.Create(); 
      //保存
              }
      好了.不貼了,太多了,從這些代碼中同樣體現出了幽雅的代碼書寫方式...好了.剩下的好處各位介紹ORM的說得太多了....;)

      總結,心得:Castle的AR底層將NHibernate封裝了起來,使用起來感覺比Nhibernate方便多了,不用再去生成一個個的映射文件,調試和維護起來都方便了很多,這應該是使用AR感覺最好的一個地方.另外配合著AR Generator,生成這些代碼那叫一個快.不過AR采用反射的方式來處理映射,如果項目大了,不知道會對性能造成多大的影響?另外,經過Castle的這樣封裝,如果再配合著Castle的容器,一定會發揮更大的威力.繼續研究學習吧.....:)
      posted on 2005-08-05 14:24  DotNetFresh  閱讀(5243)  評論(12)    收藏  舉報
      主站蜘蛛池模板: 西吉县| 欧美老熟妇乱子伦牲交视频| 亚洲熟女片嫩草影院| 久久精品国产亚洲av亚| 国产 另类 在线 欧美日韩 | 97精品伊人久久久大香线蕉| 亚洲av一本二本三本| 日韩av影院在线观看| 一区二区三区四区五区色| 亚州中文字幕一区二区| 久久午夜色播影院| 亚洲www永久成人网站| 亚洲精品欧美综合二区| 日本高清在线播放一区二区三区 | 亚洲av色在线播放一区| 欧美三级中文字幕在线观看| 四虎库影成人在线播放| 性欧美老人牲交xxxxx视频| 久久精品国产福利亚洲av| 无码人妻视频一区二区三区 | 亚洲男同志网站| 绯色蜜臀av一区二区不卡| 精选国产av精选一区二区三区| 黑人巨茎大战欧美白妇| 狠狠色噜噜狠狠狠狠蜜桃| 69天堂人成无码免费视频| 亚洲成人精品综合在线| 在线 欧美 中文 亚洲 精品| 亚洲婷婷六月的婷婷| 爱性久久久久久久久| 永久免费无码成人网站| 国产高清无遮挡内容丰富| 久久91精品牛牛| 18国产午夜福利一二区| www久久只有这里有精品| 无码精品人妻一区二区三区中| 国产一区| 麻豆国产va免费精品高清在线| 精品日韩亚洲av无码| 亚洲女初尝黑人巨| 美腿丝袜亚洲综合第一页|