• Subsonic 介绍


    Subsonic 介绍

    SubSonic:一个数据层构建器(BLL)

    导言

    个易维护的应用程序,不同的类之间有不同的分工,通常分为界面层、业务层和数据访问层。虽然这一技术有利于更好地组织应用,一些开发人员不愿这么做。创建一个可靠的和快速的数据访问层需要一些规划,一旦你创建了一个,他们看起来都是相似的。SubSonic帮助你基于数据库自动创建数据库访问层。

    SubSonic
    是什么?

    SubSonic
    是一个数据访问构建器。他还是一个auto-magic 的对象关系映射(ORM)工具,帮助你快速建立一个网站。
    像吹嘘的那样,SubSonic能做什么工作,怎么能帮助你更快的建立应用程序?SubSonic通过读取你的数据库的结构,并为你构建快速,灵活的数据访问层类。他只需要很少的配置,为你提供了不同的方法查询和保存数据,并提供方法给你定制以适应你的开发风格。SubSonic受到Rub on RailsActiveRecord的启发,不过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 20002005,包括Express版本

    Oracle

    MySQL

    SQLite

    SubSonic为你的数据库里的每个表生成三个类:

    表名奇数形式的类:例如有一个表Products,类名就是Product,这是一个强类型的类代表数据库表中的一行数据,表中的每一列对应类中的强类型的属性名,允许null的字段定义为nullable

    集合类:例如一个表Products,你将得到ProductCollection 类,这个类提供了好多方法处理数据库的数据

    个控制器(如ProductController):这提供了基本功能(创建,检索,更新和删除)。ProductProductCollection 能装载自己,是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你真的想要得到这一切,现在做的,那你可以回家享受天伦之乐。帮您解决所有这些在优点于一体,而不牺牲性能,可维护性和灵活性。现在就去下载它并给它一个尝试。你的应用会谢谢你的。 

  • 相关阅读:
    丑数系列
    452. 用最少数量的箭引爆气球
    406. 根据身高重建队列
    763. 划分字母区间
    所有二叉树题目记录
    二叉树前中后序遍历非递归(迭代)解法
    二叉树的层序遍历题目汇总
    442. 数组中重复的数据&&448. 找到所有数组中消失的数字
    225. 用队列实现栈(Easy)
    使用ClosedXML读写excel
  • 原文地址:https://www.cnblogs.com/Gemgin/p/3136372.html
Copyright © 2020-2023  润新知