本文导读:
1 引言
2 使用步骤
2.1 配置
2.2 操作数据
3 结论
4 附件
5 参考文献
1 引言
SubSonic是一个类似Rails的开源.NET项目。你可以把它看作是一把瑞士军刀,它可以用来构建Website和通过ORM方式来访问数据。Rob Conery和Eric Kemp是推动SubSonic的主要开发人员,与项目良好的发展有着密切的关系。
作为一个开发人员生产力工具,SubSonic通过从基础上支持软件开发的迭代本质,自动化了数据驱动的应用程序开发中重复性的、无趣的过程。通过这个自动生成的Web-Based的数据操纵的“架子”,轻量级和灵活的查询工具,以及一个不断丰富功能的用于通用业务数据验证和转换需要的类库,SubSonic让开发人员可以快速的构建他们的应用程序,而不是一些支撑的基础系统。
SubSonic也是一个数据层构建器一个易维护的应用程序,不同的类之间有不同的分工,通常分为界面层、业务层和数据访问层。虽然这一技术有利于更好地组织应用,一些开发人员不愿这么做。创建一个可靠的和快速的数据访问层需要一些规划,一旦你创建了一个,他们看起来都是相似的。SubSonic帮助你基于数据库自动创建数据库访问层。
2 SubSonic使用步骤
2.1 配置
SubSonic通过读取你的数据库的结构,并为你构建快速,灵活的数据访问层类。他只需要很少的配置,为你提供了不同的方法查询和保存数据,并提供方法给你定制以适应你的开发风格。SubSonic受到Rub on Rails的ActiveRecord的启发,不过SubSonic是一个纯粹的.NET组件。
和其它的ORM比较,SubSonic需要的配置很少,最小要求是将下列配置添加到Web.config(App.config)文件:
- 一个或者多个数据库连接串
- 一个SubSonic配置节
- 将适当的数据库连接到SubSonic
就是这么简单-没有必要关心要那些表或配置表和对象的映射关系。在实践中,配置看起来如下:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <!—SubSonic配置节--> <configSections> <section name="SubSonicService" type="SubSonic.SubSonicSection, SubSonic" allowDefinition="MachineToApplication" restartOnExternalChanges="true" requirePermission="false"/> </configSections> <!—数据库连接字符串--> <connectionStrings> <add name="sqlNorthwind" connectionString="Data Source=localhost; Database=Northwind; Integrated Security=true;"/> </connectionStrings> <SubSonicService defaultProvider="sqlNorthwindProvider" enableTrace="false" templateDirectory=""> <providers> <clear/> <add name="sqlNorthwindProvider" type="SubSonic.SqlDataProvider, SubSonic" connectionStringName="sqlNorthwind" generatedNamespace="DAL.Sql"/> </providers> </SubSonicService> </configuration> |
一旦你配置你的应用程序,你可以生成你的数据访问层的使用SubSonic命令行工具/图形界面工具。另外,如果你使用asp.net ,你可以用建立提供商,以动态生成的数据层。
2.1.1 命令行工具
你可以使用命令行工具(足够令人惊讶)命令行,但它是更容易打造出一个新的外部工具(见图表1)生成类。 图2显示所生成的类文件。
图1 :配置命令行工具
SubSonic生成工具生成的类是一些(.cs)物理文件,你可以看看,学习,但你不应该改变这些文件,任何改变都会在再次生成数据层时被覆盖,所有的生成的类都是部分类(partial),你可以把你自己的扩展代码放在你自己添加的文件中。
2.1.2 图形界面工具
通过安装SubSonic,可以在开始->程序菜单中找到SubSonic执行程序,打开它,如下图所示:
第一步:在图形窗口的左边菜单树中单击”Connection String”,选择菜单上面的New Connection String,如图所示增加数据库连接字符串。在右边属性窗口填写连接字符串和名称
第二步:选择菜单上面New Project,增加需要SubSonic生成的项目名称以及使用的连接字符串,如下图所示:
单击New Provider,增加provider,并选择当前项目使用的Provider,输入项目生成代码路径
第三步:在项目(Northwind)节点下,单击Provider名称,在右边窗口输入生成的.cs类的命名空间、Provider类型以及其他一些设置属性。
第四步:通过SubSonic的脚手架功能预览、编辑数据,选择项目,单击”Scaffolds”如下图所示:
2.1.3 构建提供器
为了避免编辑SubSonic生成的.cs类文件,你可以用构建提供器自动生成这些类(仅适用于Web Site)。为了使用构建提供器,你需要在web.config加类似下面的配置
<configuration> <system.web> <compilation> <buildProviders> <add extension=".abp" type="SubSonic.BuildProvider, SubSonic"/> </buildProviders> </compilation> </system.web> </configuration> |
上述配置是构建提供器处理任何在App_Code目录下以.abp结尾的文件,这和自定义的DataSet在App_Code目录添加一个XML Schema非常相似。构建提供器只需一个以.abp的文件,不需要写任何文字。当应用程序构建的时候,和命令行工具一样生成了哪些类,唯一不同的是你看不到那些文件。
2.2 操作数据
一旦使用SubSonic创建了数据访问层(DAL),无论是使用代码生成器、图形工具还是BuilderProvider,你随时可以查询你的数据库,目前SubSonic支持下列数据库
- 微软SQL SERVER 2000或2005,包括Express版本
- Oracle
- MySQL
- SQLite
SubSonic为你的数据库里的每个表生成三个类:
- 表名奇数形式的类;例如有一个表Products,类名就是Product,这是一个强类型的类代表数据库表中的一行数据,表中的每一列对应类中的强类型的属性名,允许null的字段定义为nullable
- 集合类:例如一个表Products,你将得到ProductCollection 类,这个类提供了好多方法处理数据库的数据
- 一个控制器(如ProductController):这提供了基本功能(创建,检索,更新和删除)。 而Product和ProductCollection 能装载自己,是ProductController是专为这些任务而设计的。此外,你可以把控制器作为数据源,为您的网页使用ObjectDataSource控件。
2.2.1 查询数据
强类型类让你可以用多种方法查询数据库,这取决于你的需要。下面是几种查询:
Ø 简单的查询集合
ProductCollection products = new ProductCollection().OrderByDesc(Product.CategoryIDColumn.ColumnName).Load();
Ø 复杂查询
CustomerCollection customers = new CustomerCollection()
.Where("Country", "Canada")
.Where(Customer.Columns.Region, "BC")
.OrderByDesc(Customer.Columns.PostalCode) .Load();
Ø 查询单个对象
Employee address = new EmployeeController().FetchByID(“1”).Single<Employee>();
生成的类为你提供了一个充分的方法进行查询,通过Where条件,Order by排序,甚至布尔运算。 你可以查询强类对象或集合,一个DataSet,或IDataReader,这取决于您的需要。 除了以强类型类,SubSonic 还包括一个通用的查询工具,创造性地称为Query。 You can use this to perform ad hoc queries of your database.你可以使用它从你的数据库临时性的查询。
Query q = Product.Query()
.WHERE("UnitPrice > 50")
.AND(Product.Columns.ProductName, Comparison.Like, "S%")
.BETWEEN_VALUES("CategoryID", 1, 2)
.ORDER_BY("ProductName");
this.ProductGrid.DataSource = q.ExecuteReader();
上面的例子中使用了产品类进行查询。 你可以也这样做,这所创建的查询使用代码如下:
Query qy = new Query(Product.Schema);
...
每一种方法在查询返回一个查询对象。这使您能够串起来,因为要找回你需要的数据。SubSonic 生成对象的性能是好的- 比自定义的DataSet快。因此,你使用SubSonic不会牺牲性能。
2.2.2 编辑数据
Ø 增加数据
通过对象Save()方法增加数据
Product product = new Product();
product.ProductName = "my xiaoli";
product.SupplierID = 1;
product.CategoryID = 1;
product.Discontinued = true;
//............
product.Save();
通过Insert类插入数据
int i = new Insert().Into(Product.Schema,
"ProductName",
"SupplierID",
"CategoryID",
"Discontinued“
)
.Values("my amo", 1, 1, 1).Execute();
Ø 修改数据
Product product = new Product(4);
product.ProductName = "Test";
product.Save();
int i = new Update(Product.Schema)
.Set(Product.ProductNameColumn).EqualTo("Chai -- Test") .Where(Product.ProductIdColumn).IsEqualTo(1)
.Execute();
2.2.3 删除数据
通过主键获取数据对象,执行删除操作,返回删除受影响的数据行数,如下所示:
int i = new Delete ().From<Product>()
.Where(Product.ProductIDColumn). IsEqualTo(1)
.Execute();
2.2.4 它同时还具有牛排刀...
用SubSonic,你可能忽视了名字空间SubSonic.Sugar ,但如果你这样做,你错过了一些有用的特性。SubSonic.Sugar 没有迷人的功能,而是它提供的"杂项"的功能包括特性为:
- 文件操作,如在一个请求打开和阅读文件。
- 日期操作,如确定两个日期之间有多少工作日。
- 字符串操作,例如转换,以适当的情况下,或剥HTML格式。
- 数字操作,如确定如果一个数字是不是整数。
- Web操作,如打开和阅读一个网页,或执行DNS查找。
- 验证操作,其中包括通用签证,万事达卡和其他常见的信用卡验证。
2.2.5 扩展SubSonic
没有应用能够提供满足所有需求的解决方案,因此,使用SubSonic所生成的类是不够的。您可能要像生成的类中添加方法,或者你可能要改变生成的类。 SubSonic满足这两方面的需要。
所有的SubSonic生成的类都是局部类。这意味着你可以增加功能到另一个文件,而类的名字时一样的。 如果你不喜欢SubSonic所生成的类,你可以重写模板,模板是asp.net页面。
3 结论
在下篇中进行总结,未完待续……
4 附件
SubSonic.Demo演示代码(VS.NET 2008),数据库使用Sql Server 2000的Northwind.
5 参考文献
SubSonic站点:http://www.subsonicproject.com/