zoukankan      html  css  js  c++  java
  • 轻量级ORM框架 QX_Frame.Bantina(二、框架使用方式介绍)

    轻量级ORM框架QX_Frame.Bantina系列讲解(开源

    一、框架简介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html

    二、框架使用方式介绍 http://www.cnblogs.com/qixiaoyizhan/p/7418058.html 

    三、框架性能对比 敬请期待

    【前言】

      上一节我们对Bantina ORM框架进行了简单的说明介绍,在这一节中,我们将对Bantina框架的使用方式进行说明。

      下面我们对Bantina 1.0 使用方式做详细介绍。

      介绍之前,我们先在本地创建一个数据库,作为演示使用实例以及数据库查询对比的操作对象,该数据库结构如下图所示:

      

      数据库名:DB_QX_Frame_Test

      其中包含三张表:TB_ClassName  (班级名称)

              TB_People    (人员表)

              TB_Score     (分数表)

              表之间的关系是TB_People中有TB_ClassName的外键

    【框架使用方式简介】

      我们通过Bantina1.0 ORM框架对测试表数据的增删改查来实现对框架的使用介绍。

      首先需要引用对应的dll类库 QX_Frame.Helper,类库多种获取方式在每篇介绍的最下面获取方式中有说明介绍。

      Nuget方式获取:打开Nuget包搜索器,搜索 QX_Frame.Helper,然后选择版本2.0.0 安装即可(1.0.0不包含Bantina框架)

      

      项目中引用命名空间 

      using QX_Frame.Helper_DG.Bantina;
    

      将上述表转化成对应的实体,这里可以手动写,也可以联系本人获取代码生成器进行生成。(主外键关系要配置好,查询时候需要)

     1 public class DB_QX_Frame_Test : Bantina
     2     {
     3         public DB_QX_Frame_Test() : base("data source=.;initial catalog=DB_QX_Frame_Test;persist security info=True;user id=Sa;password=Sa123456;MultipleActiveResultSets=True;App=EntityFramework") { }
     4     }
     5 
     6     [Table(TableName = "TB_People")]
     7     public class TB_People
     8     {
     9         [Key]
    10         public Guid Uid { get; set; }
    11         [Column]
    12         public string Name { get; set; }
    13         [Column]
    14         public int Age { get; set; }
    15         [Column]
    16         [ForeignKey]
    17         public int ClassId { get; set; }
    18         [ForeignTable]
    19         public TB_ClassName TB_ClassName { get; set; }
    20     }
    21 
    22     [Table(TableName = "TB_ClassName")]
    23     public class TB_ClassName
    24     {
    25         // PK(identity)  
    26         [Key]
    27         public Int32 ClassId { get; set; }
    28         //
    29         [Column]
    30         public String ClassName { get; set; }
    31     }

      1、添加数据方法Add

      实例化一个TB_People对象,然后对对象的属性进行赋值。

      实例化数据库实体上下文,然后调用异步方法Add(),将实体添加进去。

      判断异步返回结果,如果添加成功,返回Success!

     1 TB_People people = new TB_People ();
     2 people.Uid = Guid.NewGuid();
     3 people.Name = "555";
     4 people.Age = 22;
     5 people.ClassId = 3;
     6 
     7 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
     8 {
     9     if (test.Add(people).Result)
    10     {
    11         Console.WriteLine("insert success !");
    12     }
    13 }

      

      启动调试执行该方法

      原数据库记录:

      

      

      执行后数据库记录:

      

      很简单的操作,我们将该条目插入了数据库。

      我们可以在数据库上下文的对象的属性中看到执行的sql语句

      

      2、查询单条实体QueryEntity

      为什么我们不先讲Update和Delete,因为我们的Update和Delete操作是先查询确定要操作的对象后再执行对应的修改删除方法,因此我们先讲查询操作。

      查询单条我们可以直接调用对应的查询单条实体方法,并用Lambda方式传入查询条件进行查询:

    1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
    2 {
    3     TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55"));
    4     Console.WriteLine($"uid = {people.Uid} , Name = {people.Name} , ClassName = {people.TB_ClassName.ClassName}");
    5 }

      

      查询一条Name包含55的数据,如果有多条,会自动匹配第一条。

      执行上述代码:

      数据库原纪录:

      

      

      执行结果:

      

      通过主外键关联的记录也可以被查询到。

      我们可以在数据库上下文的对象的属性中看到执行的sql语句:

      

      3、查询多条记录List->QueryEntities

      查询多条我们可以直接调用查询多条的方法QueryEntites方法。该方法有多个重载,根据不同的业务需求进行不同的选择。

    1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
    2 {
    3     List<TB_People> peopleList = test.QueryEntities<TB_People>();
    4     foreach (var item in peopleList)
    5     {
    6         Console.WriteLine($"uid = {item.Uid} , Name = {item.Name} , ClassName = {item.TB_ClassName.ClassName}");
    7     }
    8 }

      

      我们执行上述的查询方法:

      数据库原纪录:

      

      执行后的结果:

      

      通过主外键关联的记录也可以被查询到。

      我们可以在数据库上下文的对象的属性中看到执行的sql语句:

      

      4、分页查询List->QueryEntitiesPaging

      分页查询和查询全部记录很相似,只要传入分页查询的参数即可。

    1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
    2 {
    3     List<TB_People> peopleList = test.QueryEntitiesPaging<TB_People, string>(1, 2, t => t.Name, t => t.Age == 3, out int count, true);
    4     foreach (var item in peopleList)
    5     {
    6         Console.WriteLine($"uid = {item.Uid} , Name = {item.Name} , ClassName = {item.TB_ClassName.ClassName}");
    7     }
    8 }

      

      我们执行上述的查询方法:

      数据库原纪录:

      

      查询后的结果如下:

      

      当前方法传递的参数说明:

    QueryEntitiesPaging<TEntity, TKey>(int pageIndex, int pageSize, Expression<Func<TEntity, TKey>> orderBy, Expression<Func<TEntity, bool>> where, out int count, bool isDESC = false)

      我们传递了一个pageIndex、pageSize、orderBy、where查询条件,以及数据库总数的一个out参数;

      通过主外键关联的记录也可以被查询到。

      我们可以在数据库上下文的对象的属性中看到执行的sql语句:

      SELECT TOP 2 * FROM (SELECT ROW_NUMBER() OVER (ORDER BY  t.Name DESC ) AS RowNumber,* FROM TB_People t  where  (t.Age = 3)) AS TTTAAABBBLLLEEE  WHERE RowNumber > (2 * (1 - 1))

      5、修改操作Update

      修改操作我们可以先查询待操作的对象,然后对对象进行修改操作。也可以直接使用lambda表达式传递修改条件进行修改。

     1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
     2 {
     3     TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55"));
     4     Console.WriteLine($"uid = {people.Uid} , Name = {people.Name} , ClassName = {people.TB_ClassName.ClassName}");
     5 
     6     people.Age = 55;
     7     if (test.Update(people).Result)
     8     {
     9         Console.WriteLine("update success !");
    10     }
    11 }

      

      我们将Name包含55的第一条记录的年龄改成55.

      我们执行上述的查询方法:

      数据库原纪录:

      

      执行结果:

      

      然后查看执行后的数据库记录:

      

      可以看到,数据已经被成功修改。

      通过数据库上下文对象我们来查看执行的sql语句:

      

      上述方法是默认根据主键进行修改,也就是说不支持主键的修改,如果想要得到主键修改的支持,请调用重载方法进行修改:

      

      当然,如果是自增字段,那么会自动跳过修改环节。

      6、删除操作Delete

      删除操作我们可以先查询待操作的对象,然后对对象进行删除操作,也可以直接使用lambda表达式传递删除条件进行删除。

     1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test())
     2 {
     3     TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55"));
     4 
     5     people.Age = 55;
     6 
     7     if (test.Delete(people).Result)
     8     {
     9        Console.WriteLine("delete success !");
    10     }
    11 }

      

      我们将Name包含55的第一条记录进行删除操作.

      我们执行上述的查询方法:

      数据库原纪录:

      

      执行结果:

      

      然后查看执行后的数据库记录:

      

      可以看到,数据已经被成功删除。

      通过数据库上下文对象我们来查看执行的sql语句:

      

      上述方法是默认根据主键进行修改,如果我们想要快捷地进行对应条件的删除,那么我们可以直接使用lambda表达式传递where条件进行修改,不需要先进行查询操作。

      

      7、原生Sql查询方式支持

      Bantina框架支持原生Sql语句的执行方式,有操作和查询两种方式,还保留了存储过程执行接口。(使用泛型便于直接将结果转化成对应的集合)

      

      我们在这里简单执行一条查询集合的sql语句:

      

      查询结果:

      

       在这里需要说明的是,这里不会直接对关联外键表进行查询,我们这里查询传入的泛型T和表查询的结果必须是一一对应的,因此,我们可以实现配置DTO数据传输对象去匹配查询的结果集。

      并不是不能实现关联查询,是为了保持sql查询的灵活性的特点没有加相应功能。


      到这里,我们大部分的基础功能操作已经演示完毕,已经可以满足我们大部分的业务需求。

      关于我们Bantina ORM 实体框架的性能介绍我们会放在下一章进行和其他常用ORM框架作为对比展示。

    【获取方式】

      1、Nuget获取:Nuget搜索 QX_Frame.Helper_DG 

      

      2、GitHub查看源代码:https://github.com/dong666/QX_Frame.Helper_DG

      注:bantina已正式改名为Bankinate,新版本GitHub:https://github.com/dong666/QX_Frame.Bantina

      3、联系本人获取,联系方式在下方博客签名中,qq、email均可。

    本文为七小站主原创作品,转载请注明出处:http://www.cnblogs.com/7tiny/ 且在文章页面明显位置给出原文链接。

    作者信息(详情):

    QiXiao_柒小(東)
    Software Development
    北京市海淀区 Haidian Area Beijing 100089,P.R.China
    郵箱Email : seventiny@foxmail.com  
    網址Http: http://www.7tiny.com
    QQ:1124999434 , WeChat: wd8622088 (尽量加微信)
    (专好结交天下英雄好汉,可聊天,可谈技,可约饭,可..嗯,原则是要有的~) 更多联系方式点我哦~


    Best Regard ~
  • 相关阅读:
    条件编译
    宏定义
    联合体,枚举类型
    结构体的概念
    C#程序报找不到时区错误
    C# ArrayList和List的区别
    C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
    C# readonly与const区别
    C#特性
    Linux vsftpd 安装配置使用
  • 原文地址:https://www.cnblogs.com/7tiny/p/7418058.html
Copyright © 2011-2022 走看看