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。 你真的想要得到这一切,现在做的,那你可以回家享受天伦之乐。 帮您解决所有这些在优点于一体,而不牺牲性能,可维护性和灵活性。 现在就去下载它并给它一个尝试。 你的应用会谢谢你的。

 
来源:http://ctfysj.blog.hexun.com/32587843_d.html

Subsonic 介绍的更多相关文章

  1. 从零开始编写自己的C#框架(5)——三层架构介绍

    三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪—<.NE ...

  2. 从零开始编写自己的C#框架(6)——SubSonic3.0插件介绍(附源码)

    前面几章主要是概念性的东西为主,向初学者们介绍项目开始前的一些知识与内容,从本章开始将会进入实操阶段,希望跟着本系统学习的朋友认真按说明做好每一步操作(对于代码最好是直接照着文档内容在你的IDE中打一 ...

  3. SubSonic指南中文版

    翻译:王鹏程张原 王伟策划:毛凌志2009年1月北京工业大学软件学院PS:有问题反馈至http://lexus.cnblogs.comGetting Started with SubSonicBy S ...

  4. .NET 轻量级 ORM 框架 - Dapper 介绍

    Dapper简单介绍: Dapper is a single file you can drop in to your project that will extend your IDbConnect ...

  5. 体验SubSonic

    体验SubSonic SubSonic简介 SubSonic配置 利用sonic.exe来生成代码 通过Substage来生成代码 简单操作示例 1.SubSonic简介 一句讲完就是:SubSoni ...

  6. Dapper 介绍

    转载:http://***/html/itweb/20130918/125194_125199_125210.htm .NET 轻量级 ORM 框架 - Dapper 介绍 Dapper简单介绍: D ...

  7. .NET 常用ORM之SubSonic

    一.SubSonic简单介绍 SubSonic是一个类似Rails的开源.NET项目.你可以把它看作是一把瑞士军刀,它可以用来构建Website和通过ORM方式来访问数据.Rob Conery和Eri ...

  8. 【推荐】 体验SubSonic

    SubSonic简介 SubSonic配置 利用sonic.exe来生成代码 通过Substage来生成代码 简单操作示例 1.SubSonic简介 一句讲完就是:SubSonic就是一个ORM开源框 ...

  9. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

随机推荐

  1. JQuery 元素操作 each循环

    参考:http://jquery.cuishifeng.cn/css.html 1.属性操作 --------------------------属性 $("").attr(); ...

  2. HBase Region分裂实现

    分裂策略 不同的分裂策略的实现需要继承RegionSplitPolicy,主要实现两个方法: shouldSplit()表示是否需要分裂 getSplitPoint()得到分裂点rowkey 从 HB ...

  3. Oracle EBS 启用关于此页

    FND:诊断英文为FND: Diagnostics,用于设置是否显示“关于此页”个性化自助定义英文为Personalize Self-Service Defn,用户设置在登录后,OAF页面是否显示“个 ...

  4. MySQL案例09:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log

    刚处理完“挖矿”事件,在做最后一个MySQL NBU备份的时候,发现从库有问题,好奇的是怎么主从状态异常没有告警呢?先不管这么多了,处理了这个问题再完善告警内容. 一.错误信息 从库show slav ...

  5. 用UITextView加载rtfd文件

    用UITextView加载rtfd文件 效果 说明 使用此方法可以实现十分简易的富文本显示效果,包括图文混排等等效果. 源码 // // ViewController.m // Rtfd // // ...

  6. UITextField使用的一些细节

    UITextField使用的一些细节 这篇博文是我自己使用UITextField的一些总结,并没有太多营养,并会持续更新. 2014.9.15 ---------------------------- ...

  7. Office 365实现单点登录系列(4)—安装AD FS

    单一登录 (Single Sign-On)简而言之,就是让用户使用一套ID和密码,就可以登录一个或多个系统的授权机制.用户只需要通过其中一个应用的安全认证之后,再访问同一服务器其他应用的资源时不需要再 ...

  8. 程序员减少代码BUG的7种方法,拒绝编程5分钟,查代码2小时!

    0.别对警告视而不见 相信不少的程序员会使用IDEA,使用它敲代码,有时候会出现警告,那么这时你对警告就不能视而不见了. 我们的目标是,写干净的代码,做风一样的男子! 1.编程习惯 种瓜得瓜种豆得豆, ...

  9. 有效集 matlab代码

    %有效集 function activeset H=[2 -1; -1 4]; c=[-1 -10]'; Ae=[ ]; be=[ ]; Ai=[-3 -2; 1 0; 0 1]; bi=[-6 0 ...

  10. 我的Java之旅——答答租车系统的改进

    之前的答答租车系统虽然可以实现项目的要求,但是没有用Java面向对象,今天用面向对象的三大特性封装.继承和多态来改进原来的代码.题目和之前的代码参考上篇博客,这里不再述说. 改进后的代码: Vehic ...