Subsonic使用
SubSonic:一個數據層構建器(BLL)
導言
一 個易維護的應用程序,不同的類之間有不同的分工,通常分為界面層、業務層和數據訪問層。雖然這一技術有利于更好地組織應用,一些開發人員不愿這么做。創建 一個可靠的和快速的數據訪問層需要一些規劃,一旦你創建了一個,他們看起來都是相似的。SubSonic幫助你基于數據庫自動創建數據庫訪問層。
SubSonic是什么?
SubSonic是一個數據訪問構建器。他還是一個auto-magic 的對象關系映射(ORM)工具,幫助你快速建立一個網站。
像吹噓的那樣,SubSonic能做什么工作,怎么能幫助你更快的建立應用程序?SubSonic通過讀取你的數據庫的結構,并為你構建快速,靈活的數據 訪問層類。他只需要很少的配置,為你提供了不同的方法查詢和保存數據,并提供方法給你定制以適應你的開發風格。SubSonic受到Rub on Rails的ActiveRecord的啟發,不過SubSonic是一個純粹的.NET組件。
SubSonic配置
和其它的ORM比較,SubSonic需要的配置很少,最小要求是將下列配置添加到web.config(app.config)文件:
一個或者多個數據庫連接串
一個SubSonic配置節
連接適當的數據庫連接到SubSonic
就是這么簡單-沒有必要關心要那些表或配置表和對象的映射關系。在實踐中,配置看起來如下:
在Web.config的<configuration>中添加下表內容,注意< configSections >元素必須是 configuration元素的第一個子元素。其中<connectionStrings>節就是通用的連接字符串
<configuration>
<!--1-配置SubSonic -->
<configSections>
<section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" allowDefinition="MachineToApplication" restartOnExternalChanges="true" requirePermission="false"/>
</configSections>
<!--2-數據庫字符串連接 -->
<connectionStrings>
<add name="數據庫連接" connectionString="Data Source=192.168.0.2;Initial Catalog=????????????? Northwind;userid=aspuser;password=000000" providerName="System.Data.SqlClient" />
</connectionStrings>
<!--3-SubSonic與數據庫連接 -->
<SubSonicService defaultProvider="SubsonicProvider">
<providers>
<clear/>
<add name="SubsonicProvider" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="數據庫連接"?generatedNamespace="Northwind" excludeTableList="^aspnet_Applications$,^aspnet_Membership$,^aspnet_Paths$"??????? generateODSControllers="false" removeUnderscores="false" stripTableText="Global_,Account_,_tb,Form_" stripViewText="Global_,Account_,_vw,Form_" fixPluralClassNames="false" />
</providers>
</SubSonicService>
</configuration>
<providers>里的參數說明:
generatedNamespace="Northwind"?設定生成代碼命名空間,修改為你希望的命名空間;
connectionStringName="數據庫連接"?使用數據庫的連接字符串,修改為你要使用的數據庫連接字符串;
excludeTableList="^aspnet_Applications$,^aspnet_Membership$,^aspnet_Paths$"
不生成aspnet_Applications, aspnet_Membership, aspnet_Paths這三個表相關代碼;
generateODSControllers="false"不生成Controllers類;
removeUnderscores="false"不移除生成對象名稱下劃線;
stripTableText="Global_,Account_,_tb,Form_"生成表相關對象名稱開頭如果與設定值匹配則去掉;
stripViewText="Global_,Account_,_vw,Form_"視圖名處理與與上面表處理相同;
fixPluralClassNames="false"?不去除類名的復數s
當有多個<providers>節點時,可以用下面的方法再添加一個,注意加上<clear/>這個節點
獲取數據
一旦你用SubSonic創建了數據訪問層(DAL),無論是使用代碼生成器還是BuilderProvider,你隨時可以查詢你的數據庫,目前SubSonic支持下列數據庫
微軟SQL SERVER 2000或2005,包括Express版本
Oracle
MySQL
SQLite
SubSonic為你的數據庫里的每個表生成三個類:
表名奇數形式的類:例如有一個表Products,類名就是Product,這是一個強類型的類代表數據庫表中的一行數據,表中的每一列對應類中的強類型的屬性名,允許null的字段定義為nullable
集合類:例如一個表Products,你將得到ProductCollection 類,這個類提供了好多方法處理數據庫的數據
一 個控制器(如ProductController):這提供了基本功能(創建,檢索,更新和刪除)。 而Product和ProductCollection 能裝載自己,是ProductController是專為這些任務而設計的。此外,你可以把控制器作為數據源,為您的網頁使用 ObjectDataSource控件。
Subsonic2.1使用
1.引用命名空間
如果生成代碼文件是Northwind(web.config中generatedNamespace="Northwind",如上面配置)在使用文件中引用
using Northwind;
2.插入記錄
如下代碼可在表Region中插入一條記錄
Region.Insert(10, "TestSubsonic2.1");
3.修改記錄
a.單個記錄修改,下面代碼可修改上面剛插入的記錄
Region region = new Region(10);
??? region.RegionDescription = "TestSubsonic_Update";
??? region.Save();
b.批量更新
Query q = Region.Query();
??? q.AddWhere(Region.Columns.RegionDescription,"test");
??? q.AddUpdateSetting(Region.Columns.RegionDescription,"TestSubsonic");
q.QueryType = QueryType.Update;
??? q.Execute();
上面代碼把所有RegionDescription值為test 的記錄修改為TestSubsonic
4.刪除記錄
a.刪除單個記錄
Region.Delete(10);
刪除主鍵值 RegionID 為10的記錄
b.批量刪除
Query q = Region.Query();
??? q.AddWhere(Region.Columns.RegionDescription,"test");
??? q.QueryType = QueryType.Delete;
??? q.Execute();
以上代碼刪除所有RegionDescription值等于test的記錄
5.查詢數據
Query q = Region.Query();
??? q.AddWhere(Region.Columns.RegionID,Comparison.GreaterOrEquals, 2);
DataTable dt = q.ExecuteDataSet().Tables[0];
以上代碼獲取Region表中RegionID >= 2 的數據表
Query q = Region.Query();
??? q.AddWhere(Region.Columns.RegionDescription,Comparison.Like, "te" +"%");
??? DataTable dt = q.ExecuteDataSet().Tables[0];
??? 以上Like查詢,返回所有RegionDescription列值以te開頭的記錄表
6.獲取對象集合
RegionCollection coll = DB.Select().From("Region").Where("RegionId")
??????????? .IsGreaterThan(2).ExecuteAsCollection<RegionCollection>();
??? int id = coll[0].RegionID;
??? string description = coll[0].RegionDescription;
以上代碼獲取RegionId > 2 的Region對象集合coll后,就可以操作對象數據值
SubSonic基本操作
查詢
SubSonic2.1版本 – 列出3種查詢。
Product product = new Select().From<Product>().Where(Product.ProductIDColumn).IsEqualTo(4)
? .ExecuteSingle<Product>();
Product product = DB.Select().From<Product>().Where("ProductID").IsEqualTo(4)
? .ExecuteSingle<Product>();
Query query = new Query(Product.Schema);
query.WHERE("ProductID=4").ORDER_BY("ProductID asc");
IDataReader dr = Product.FetchByQuery(query);
DataSet product = new?? Query(Product.Schema).WHERE("ProductID=4").ORDER_BY("Prod? uctID asc")
.ExecuteDataSet();
?
關聯查詢
DataSet product = new Select(Product.ProductNameColumn,Category.CategoryNameColumn).From<Product>()
? .InnerJoin(Category.CategoryIDColumn, Product.CategoryIDColumn)
.Where(Category.CategoryIDColumn).IsGreaterThan(4).ExecuteDataSet();
注意. InnerJoin(f2, f1) 的使用方法。
分頁查詢
List<Product> products = new Select().From<Product>()
??? .Where(Product.ProductIDColumn).IsEqualTo(4).Paged(1, 30).ExecuteTypedList<Product>();
?
查詢—返回對象
ExecuteReader();?? 返回DataReader
ExecuteScalar();?? 返回對象
ExecuteScalar<string>();? 返回泛型對象
ExecuteSingle<Product>(); 返回表實體對象
ExecuteTypedList<Product>();? 返回泛型表實休數據集
ExecuteDataSet();? 返回DataSet
ExecuteJoinedDataSet<強數型數據集>(); 返回關聯查詢 DataSet
Execute(); 返回執行后,數據更新條數
?
SQL關鍵詞
IsEqualTo(obj) // 等于 value
IsBetweenAnd(obj1, obj2) // [字段1] BETWEEN 值1 AND 值2
StartsWith? // LIEK '1%‘
EndsWith??? // LIEK '%1‘
IsGreaterThan // [字段1] > 值1
IsGreaterThanOrEqualToIsGreaterThan // [字段1] >= 值1
IsLessThan // [字段1] < 值1
IsLessThanOrEqualToIsLessThan // [字段1] <= 值1
WhereExpression / AndExpression // Expression 表示括號
C#:
.Where("1").IsGreaterThan(1)
? .And("2").IsGreaterThanOrEqualTo(2)
? .AndExpression("3").IsLessThan(3)
? .AndExpression("4").IsLessThanOrEqualTo(4).And("5").StartsWith("5")
? .AndExpression("6").EndsWith("6")
? .ExecuteSingle<Product>();
SQL:WHERE 1 > @1AND 2 >= @2 AND (3 < @3) AND (4 <= @4 AND 5 LIKE @5) AND (6 LIKE @6)
?
修改
Product product = new Product(4);
product.ProductName = "amo";
product.Save();
int i = new Update(Product.Schema)
? .Set(Product.ProductNameColumn).EqualTo("Chai -- Amo")
? .Where(Product.ProductIdColumn).IsEqualTo(1)
? .Execute();
?
添加
Product product = new Product();
product.ProductName = "my xiaoli";
product.SupplierID = 1;
product.CategoryID = 1;
product.Discontinued = true;
//............
product.Save();
int i = new Insert().Into(Product.Schema,
? "ProductName",
? "SupplierID",
? "CategoryID",
? "Discontinued“
)
.Values("my amo", 1, 1, 1).Execute();
?
刪除
int i = new Delete ().From<Product>()
? .Where(Product.ProductIDColumn). IsEqualTo(1)
? .Execute();
?
事務1
List<Insert> queries = new List<Insert>();
queries.Add(new Insert().Into(Product.Schema).Values("product1"));
queries.Add(new Insert().Into(Product.Schema).Values("product2"));
queries.Add(new Insert().Into(Product.Schema).Values("product3"));
queries.Add(new Insert().Into(Product.Schema).Values("product4"));
queries.Add(new Insert().Into(Product.Schema).Values("product5"));
queries.Add(new Insert().Into(Product.Schema).Values("product6"));
queries.Add(new Insert().Into(Product.Schema).Values("product7"));
//execute in a transaction
SqlQuery.ExecuteTransaction(queries);
事務2
using (SharedDbConnectionScope sp = new SharedDbConnectionScope())
{
??? using (TransactionScope scope = new TransactionScope())
??? {
??????? // coding....
??????? scope.Complete();
??? }
}
?
減少對ActiveRecord的依賴
MyProduct product = new Select(
? Product.ProductNameColumn,
? Category.CategoryNameColumn
??? ).From<Product>()
?? .InnerJoin(Category.CategoryIDColumn, Product.CategoryIDColumn)
?? .Where(Category.CategoryIDColumn).IsGreaterThan(4)
?? .ExecuteSingle<MyProduct>();
string cname = product.CategoryName;
string pname = product.ProductName;
?
自定義MyProduct實體類
public class MyProduct : ActiveRecord<MyProduct> {
??????? public string CategoryName {
??????????? get { return GetColumnValue<string>(Category.Columns.CategoryName); }
??????????? set { SetColumnValue(Category.Columns.CategoryName, value); }
??????? }
??????? public string ProductName {
??????????? get { return GetColumnValue<string>(Product.Columns.ProductName); }
??????????? set { SetColumnValue(Product.Columns.ProductName, value); }
??????? }
??? }
它同時還具有牛排刀...
用SubSonic,你可能忽視了名字空間SubSonic.Sugar ,但如果你這樣做,你錯過了一些有用的特性。SubSonic.Sugar 沒有迷人的功能,而是它提供的"雜項"的功能包括特性為:
文件操作,如在一個請求打開和閱讀文件。
日期操作,如確定兩個日期之間有多少工作日。
字符串操作,例如轉換,以適當的情況下,或剝HTML格式。
數字操作,如確定如果一個數字是不是整數。
Web操作,如打開和閱讀一個網頁,或執行DNS查找。
驗證操作,其中包括通用簽證,萬事達卡和其他常見的信用卡驗證。
擴展SubSonic
沒有應用能夠提供滿足所有需求的解決方案,因此,使用SubSonic所生成的類是不夠的。您可能要像生成的類中添加方法,或者你可能要改變生成的類。 SubSonic滿足這兩方面的需要。
所有的SubSonic生成的類都是局部類。這意味著你可以增加功能到另一個文件,而類的名字時一樣的。 如果你不喜歡SubSonic所生成的類,你可以重寫模板,模板是asp.net頁面。
總結
你 知道你有一個數據庫,你需要連接到一個應用。你知不知道在頁面中直接發送SQL的請求是一個壞的架構。 你知道你應該為你的應用寫一數據層管理CRUD。 你真的想要得到這一切,現在做的,那你可以回家享受天倫之樂。 幫您解決所有這些在優點于一體,而不犧牲性能,可維護性和靈活性。 現在就去下載它并給它一個嘗試。 你的應用會謝謝你的。
其他資源
infoq 關于SubSonic的問答SubSonic介紹_Wind
總結
以上是生活随笔為你收集整理的Subsonic使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.如何判断正交表对错
- 下一篇: 神经网络控制器设计原理,神经网络控制系统