乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      SubSonic 3.0新特性

       Richard118 2014-04-18

      1.    引言

      大多數(shù)數(shù)據(jù)訪問程序包提供從“數(shù)據(jù)庫外”訪問,意思是這種方式將您的數(shù)據(jù)庫的表在應(yīng)用程序中用對象表示。這種方式可以在大多數(shù)案例中工作,但是關(guān)系理論與面向?qū)ο缶幊虒⒆兊牟灰恢拢础板e(cuò)誤的匹配”。

      許多人喜歡只使用類工作,但不想關(guān)心數(shù)據(jù)庫的具體實(shí)現(xiàn)。為了釋放他們的工作,同時(shí)又不開放數(shù)據(jù)庫設(shè)計(jì)內(nèi)部實(shí)現(xiàn)。SubSonic創(chuàng)建了一個(gè)免費(fèi)基類且單獨(dú)存在的,作為純粹的CLR對象(也稱為POCO)。

      如果你是這些人之一,你不需要特別關(guān)心的數(shù)據(jù)庫結(jié)構(gòu)的,那么SimpleRepository是給你準(zhǔn)備的。

       

      2.    使用SimpleRepository

      使用Rails的有關(guān)工作的有趣的事情之一就是你可以建立從代碼和專注于您的應(yīng)用程序的數(shù)據(jù)庫。許多開發(fā)者發(fā)現(xiàn)這種非常自由(包括我自己在內(nèi))。它的一個(gè)缺點(diǎn),就是你需要學(xué)習(xí)的遷移代碼,你需要知道它是如何工作的。這對我們來說,不是一個(gè)好的辦法,而是一直希望Rails將“只知道”我們要遷移的東西。

      這就是為什么我們想使用SubSonic的自動(dòng)遷移。這里的目標(biāo)是,如果您在構(gòu)造SimpleRepository對象時(shí)設(shè)置一個(gè)標(biāo)志,告訴它遷移模式:自動(dòng)創(chuàng)建和同步數(shù)據(jù)庫,其關(guān)鍵是在構(gòu)造函數(shù)中設(shè)置適當(dāng)?shù)倪x項(xiàng),如:

      var repository = new SimpleRepository(SimpleRepositoryOptions.RunMigrations);

      設(shè)置選項(xiàng)RunMigrations告訴SubSonic在更新或保存數(shù)據(jù)時(shí)同步你的模型對象到數(shù)據(jù)庫。

      添加對SubSonic的引用,這部分非常簡單,右鍵單擊您的項(xiàng)目,添加引用,瀏覽以查找SubSonic3.0DLL(SubSonic.Core.dll)。

      本例子使用的是SQLite數(shù)據(jù)庫,添加對System.Data.SQLite的引用

      設(shè)置數(shù)據(jù)庫連接字符串

      <add name="Northwind" connectionString="server=.\SQLExpress;database=SubSonic;integrated security=true;" providerName="System.Data.SqlClient"/>
       

      <connectionStrings>

          <add name="NorthwindSQLite"

               connectionString="Data Source=D:\Program Files\Sqliteman\test.db"

               providerName="System.Data.SQLite"/> 
       
      <add name="NorthwindMySql" connectionString="server=localhost;database=northwind;user id=root; password=" providerName="MySql.Data.MySqlClient"/>

       

       

      2.1 自動(dòng)遷移

      例如有以下post對象:

          public class Post

          {

              public Guid ID { get; set; }

              public string Title { get; set; }

              public string Body { get; set; }

       

          }

       

      當(dāng)使用SimpleRepository對象時(shí),設(shè)置構(gòu)造函數(shù)選項(xiàng)RunMigrations,他將會(huì)自動(dòng)創(chuàng)建你需要的表。

      //基于NorthwindSQLite數(shù)據(jù)庫創(chuàng)建一個(gè)repository對象并自動(dòng)遷移

      var repo = new SubSonic.Repository.SimpleRepository("NorthwindSQLite", SimpleRepositoryOptions.RunMigrations);

                  //var post = repo.Single<Post>(x => x.Title == "My Title");

                  Post post = new Post();

                  post.ID = Guid.NewGuid().ToString();

                  post.Title = "My Title";

                  post.Body = "My Titlessssssssssssss";

                  var obj = repo.Add<Post>(post);

      在這個(gè)例子中是不能查詢Title” My Title”的記錄,因?yàn)闆]有Post表。執(zhí)行Single()方法后,SubSonic將運(yùn)行遷移,并創(chuàng)建表,這樣就不會(huì)有錯(cuò)誤。 當(dāng)?shù)谝淮芜\(yùn)行,下面的SQL將被執(zhí)行之前選擇:

      CREATE TABLE [Posts] (
       [ID] uniqueidentifier NOT NULL PRIMARY KEY,
       [Title] nvarchar(255) NOT NULL,
       [Body] nvarchar(255) NOT NULL,
      );
      ALTER TABLE [Posts]
      ADD CONSTRAINT PK_Posts_Key PRIMARY KEY([ID])";

       

      請注意,表名是復(fù)數(shù)(默認(rèn)),“ID”屬性選定為主鍵(默認(rèn))和字符串長度默認(rèn)為255

      你也可以改變SubSonic生成方法,并使用小的屬性設(shè)置

       主鍵:如果你調(diào)用一列“ID”或“Key”或“[ClassName]ID”,無論它的類型都將是表的主鍵。如果你想到其他的屬性列,你可以使用一個(gè)主鍵屬性(“SubSonicPrimaryKey”),SubSonic將使用該列作為主鍵。

       字符串長度:有兩種方法告訴SubSonic的如何處理這一點(diǎn),包括使用屬性。第一類是“SubSonicStringLengthint length)”,第二是“SubSonicLongString”為nvarcharmax)或LONGTEXT設(shè)置,依賴于您的提供程序。

       空:默認(rèn)為不為null,但你可以修改屬性為空類型的。

       數(shù)值精度:默認(rèn)值是10精度和2位小數(shù)點(diǎn),但你可以改變,隨著“SubSonicNumericPrecision(int precision, int scale)”屬性。

       忽略屬性:你可以使用“SubSonicIgnore”忽略生成的屬性。

       

      2.2 更新模型

      開始部分都是容易的,但是隨著你的開發(fā)將會(huì)更改或移除類的屬性,SubSonic將會(huì)很好的配合你的改變。

      例如,假設(shè)你已經(jīng)添加了PublishDate到您的Post類:

          public class Post

          {

              public string ID { get; set; }

              public string Title { get; set; }

       

              public string Body { get; set; }

              public DateTime PublishDate { get; set; }

          }

       

      當(dāng)下次使用SimpleRepository進(jìn)行(Save/Find/Get)數(shù)據(jù)操作時(shí),下面的SQL命令將在此之前執(zhí)行:

      ALTER TABLE [Posts] ADD DateTime datetime NOT NULL CONSTRAINT DF_Posts_PublishDate DEFAULT ('01/01/0001');
      UPDATE SubSonicTests SET PublishDate ='01/01/0001';

       

      在這里發(fā)生有如下幾件事:

      第一,   增加的列(不可為空,可以通過使用DateTime?)。

      第二,   默認(rèn)修改的地方(使用DateTime.MinValue,一個(gè)非空列應(yīng)在生成的時(shí)候約定默認(rèn)值。

      UPDATE語句依據(jù)設(shè)置的默認(rèn)值處理現(xiàn)有的數(shù)據(jù)庫設(shè)置(像SQLiteMySQL或其他數(shù)據(jù)庫)。 另刪除的屬性將導(dǎo)致列從數(shù)據(jù)庫中刪除。

       

      2.3 查詢

      可以通過SimpleRepository對象從數(shù)據(jù)庫中查詢數(shù)據(jù),甚至于使用LINQ:

      var repo=new SimpleRepository(SimpleRepositoryOptions.RunMigrations);
       
      //see if a record exists
      bool exists=repo.Exists<Post>(x=>x.Title=="My Title");
       
      //use IQueryable
      var qry=from p in repo.All<Post>()
              where p.Title=="My Title"
              select p;
       
      //get a post
      var post=repo.Single<Post>(x=>x.Title=="My Title");
      var post=repo.Single<Post>(key);
       
      //a lot of posts
      var posts=repo.Find<Post>(x=>x.Title.StartsWith("M"));
       
      //a PagedList of posts - using 10 per page
      var posts=repo.GetPaged<Post>(0,10);
      //sort by title
      var posts=repo.GetPaged<Post>("Title",0,10);
       
      //add a post
      var newKey=repo.Add(post);
       
      //add a lot of posts - using a transaction
      IEnumerable<Post> posts=GetABunchOfNewPosts();
      repo.AddMany(posts);
       
      //update a post
      repo.Update(post);
       
      //update a bunch of posts in a transaction
      IEnumerable<Post> posts=GetABunchOfNewPosts();
      repo.UpdateMany(posts);
       
      //delete a post
      repo.Delete<Post>(key);
       
      //delete a lot of posts
      repo.DeleteMany <Post>(x=>x.Title.StartsWith("M"));
       
      //delete posts using a transaction
      IEnumerable<Post> posts=GetABunchOfNewPosts();
      repo.DeleteMany(posts);

       

       

       

      3.    使用ActiveRecord

      針對您的數(shù)據(jù)和數(shù)據(jù)庫ActiveRecord的是最簡單,最容易的方法。該模式是,每個(gè)實(shí)例對應(yīng)的是一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)行,這意味著每個(gè)對象類型可以被認(rèn)為是你的數(shù)據(jù)庫表。

      許多開發(fā)人員不喜歡與他們的數(shù)據(jù)庫緊耦合工作,但其他人認(rèn)為這是非常理想方式,消除了與數(shù)據(jù)庫抽象工作有利于面向?qū)ο蟮摹白杩共黄ヅ洹薄?/span>

      SubSonicActiveRecord是給你需要的,然后自己決定如何做。你會(huì)發(fā)現(xiàn)你有能力使用LINQ是如此易用的代碼,快速和簡單的依據(jù)數(shù)據(jù)庫生成代碼。

      3.1設(shè)置模板連接

      T4模板創(chuàng)造類文件,需要知道連接字符串。要設(shè)置:打開文件名為“Settings.ttinclude”,在@ import語句下面,您會(huì)看到三個(gè)設(shè)置,如下:

      const string Namespace = "Northwind.Data";
      const string ConnectionStringName = "Northwind";
       
      const string DatabaseName = "Northwind";

      主要設(shè)置是“ConnectionStringName”, 這告訴SubSonic的使用的哪個(gè)數(shù)據(jù)庫連接。Namespace常量用來SubSonic生成代碼的命名空間。 注意包含的所有*.tt文件需要匹配您的數(shù)據(jù)庫,如下:

      //其他文件: MySQL.ttinclude, SQLite.ttinclude
      <#@ include file="SQLServer.ttinclude" #>

      3.2項(xiàng)目中增加T4模板

      上述設(shè)置完成后,只要將T4模板拖入到您的項(xiàng)目。因?yàn)?/span>Visual Studio 2008中看到一個(gè)“*.tt”文件,它會(huì)自動(dòng)執(zhí)行它。所以你不必做任何事情,只需要運(yùn)行程序。

      文件列表如下:

      ActiveRecord.tt

      Context.tt

      Settings.ttinclude

      SQLServer.ttinclude OR MySQL.ttinclude OR SQLite.ttinclude

      StoredProcedures.tt (可選項(xiàng),如果執(zhí)行存儲(chǔ)過程需要添加此文件)

      Structs.tt

      如果更改了數(shù)據(jù)庫,只需右鍵單擊ActiveRecord.ttContext.ttStructs.tt文件并選擇“運(yùn)行自定義工具”,將會(huì)自動(dòng)執(zhí)行它們。

       

      3.3查詢

      使用ActiveRecord的查詢非常方便,下面是單元測試的一些例子:

      //差錢ID=1的默認(rèn)單條記錄
      var product = Product.SingleOrDefault(x => x.ProductID == 1);
       
      //查詢ProductID <= 10的記錄
      var products = Product.Find(x => x.ProductID <= 10);
       
      //獲取服務(wù)器端的分頁列表
      var products = Product.GetPaged(0,10);
       
      //使用Linq查詢
      var products = from p in Product.All()
                join od in OrderDetail.All() on p.ProductID equals od.ProductID
                select p;

       

      從上面的代碼可以中注意與SubSonic2.0的一些不同。

      4.    結(jié)論

      SimpleRepository使用和測試很簡單,因?yàn)樗鼜?/span>SubSonic.Repository.IRepository繼承。如果按照注入模式,即傳遞一個(gè)IRepository,那么你可以使用你最喜歡的模擬工具或創(chuàng)建一個(gè)假的Repository查詢。

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多