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ù)庫。 l 添加對SubSonic的引用,這部分非常簡單,右鍵單擊您的項(xiàng)目,添加引用,瀏覽以查找SubSonic的3.0的DLL(SubSonic.Core.dll)。 l 本例子使用的是SQLite數(shù)據(jù)庫,添加對System.Data.SQLite的引用 l 設(shè)置數(shù)據(jù)庫連接字符串
2.1 自動(dòng)遷移 例如有以下post對象:
當(dāng)使用SimpleRepository對象時(shí),設(shè)置構(gòu)造函數(shù)選項(xiàng)RunMigrations,他將會(huì)自動(dòng)創(chuàng)建你需要的表。
在這個(gè)例子中是不能查詢Title是” My Title”的記錄,因?yàn)闆]有Post表。執(zhí)行Single()方法后,SubSonic將運(yùn)行遷移,并創(chuàng)建表,這樣就不會(huì)有錯(cuò)誤。 當(dāng)?shù)谝淮芜\(yùn)行,下面的SQL將被執(zhí)行之前選擇:
請注意,表名是復(fù)數(shù)(默認(rèn)),“ID”屬性選定為主鍵(默認(rèn))和字符串長度默認(rèn)為255。 你也可以改變SubSonic生成方法,并使用小的屬性設(shè)置 主鍵:如果你調(diào)用一列“ID”或“Key”或“[ClassName]ID”,無論它的類型都將是表的主鍵。如果你想到其他的屬性列,你可以使用一個(gè)主鍵屬性(“SubSonicPrimaryKey”),SubSonic將使用該列作為主鍵。 字符串長度:有兩種方法告訴SubSonic的如何處理這一點(diǎn),包括使用屬性。第一類是“SubSonicStringLength(int length)”,第二是“SubSonicLongString”為nvarchar(max)或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類:
當(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è)置(像SQLite和MySQL或其他數(shù)據(jù)庫)。 另刪除的屬性將導(dǎo)致列從數(shù)據(jù)庫中刪除。
2.3 查詢 可以通過SimpleRepository對象從數(shù)據(jù)庫中查詢數(shù)據(jù),甚至于使用LINQ:
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> SubSonic的ActiveRecord是給你需要的,然后自己決定如何做。你會(huì)發(fā)現(xiàn)你有能力使用LINQ是如此易用的代碼,快速和簡單的依據(jù)數(shù)據(jù)庫生成代碼。 3.1設(shè)置模板連接 T4模板創(chuàng)造類文件,需要知道連接字符串。要設(shè)置:打開文件名為“Settings.ttinclude”,在@ import語句下面,您會(huì)看到三個(gè)設(shè)置,如下:
主要設(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)行程序。 文件列表如下: 2 ActiveRecord.tt 2 Context.tt 2 Settings.ttinclude 2 SQLServer.ttinclude OR MySQL.ttinclude OR SQLite.ttinclude 2 StoredProcedures.tt (可選項(xiàng),如果執(zhí)行存儲(chǔ)過程需要添加此文件) 2 Structs.tt 如果更改了數(shù)據(jù)庫,只需右鍵單擊ActiveRecord.tt,Context.tt和Structs.tt文件并選擇“運(yùn)行自定義工具”,將會(huì)自動(dòng)執(zhí)行它們。
3.3查詢 使用ActiveRecord的查詢非常方便,下面是單元測試的一些例子:
從上面的代碼可以中注意與SubSonic2.0的一些不同。 4. 結(jié)論 SimpleRepository使用和測試很簡單,因?yàn)樗鼜?/span>SubSonic.Repository.IRepository繼承。如果按照注入模式,即傳遞一個(gè)IRepository,那么你可以使用你最喜歡的模擬工具或創(chuàng)建一個(gè)假的Repository查詢。 |
|