简介:SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM。解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程序员来说,是非常简单的,其语法特点与Linq to Sql极为相似。不仅实现了完整的Select、Insert、Update、Delete等语句解析器,同时,也实现了Select、where、order by等子句,这些语句与子句均支持导出SQL语句,使得拼接复杂场景SQL语句变得轻松,SqlRepoEx很快其原生数据访问与Dapper不相上下,SqlRepoEx本身支持Sql Server与MySql方言,同时通过SqlRepoEx.Normal支持非方言SQL。SqlRepoEx没侵入性,仅通过简单的几个特性,就能让类与数据库关联起来;

*本系列以静态工厂为例;

*数据来源于Northwind数据库;

*完整的代码见 https://github.com/AzThinker/SqlRepoEx2.0StartGuid  https://gitee.com/azthinker/SqlRepoEx2.0StartGuid

1、从 SqlRepoEx 2.2.1 起,标识数据据字段的特性标识改为使用System.ComponentModel.DataAnnotations中的声明,降低使用难度,当然 SqlRepoEx 中自定义的特性依然是支持的。

2、只有以类属性定义的,才能作为数据字段使用, SqlRepoEx 只反身属性。

3、SqlRepoEx 不使用XML文件来映射关系

一、表名

1、如果不使用任何特性, SqlRepoEx会将当前类名当成数名。

如:

public sealed class AzProducts

{

...

}

会返回形如  select ...  from AzProducts

显然,AzCategories在数据库中不存在,当然,如果类名与数据库中对应的表名一至,是可以不用标识的。

2、使用 Table 特性,定义在System.ComponentModel.DataAnnotations中

[Table("Products")]

public sealed class AzProducts

{

...

}

会返回形如  select ...  from Products

3、使用 TableName特性,定义在SqlRepoEx.Core.CustomAttribute中

[TableName("Products")]

public sealed class AzProducts

{

...

}

同样会返回形如  select ...  from Products

当然,使用哪种,按各自的喜好

二、关键字段

1、如果未使用任何特性,在使用,For() 方法时,不会自动的产生Where条件语句。

[Table("Products")]

public sealed class AzProducts

{

public int ProductID { get; set; }

...

}

当使用

AzProducts azProducts = new AzProducts { ProductName2 = "testvalue", ProductID = 82 };

var resultUpdate = repository.Delete().For(azProducts);

只会产生

DELETE [dbo].[Products]

当然,这不所期望的

2、使用 Key 特性 Table 定义在System.ComponentModel.DataAnnotations中

[Table("Products")]

public sealed class AzProducts

{

[Key]

public int ProductID { get; set; }

...

}

会返回形如 DELETE [dbo].[Products] WHERE  [ProductID] = 82;

3、使用 KeyField 特性 Table定义在SqlRepoEx.Core.CustomAttribute中

[TableName("Products")]

public sealed class AzProducts

{

[KeyField]

public int ProductID { get; set; }

...

}

同样会返回形如 DELETE [dbo].[Products] WHERE  [ProductID] = 82;

三、标识字段(自增字段)

1、如果未使用任何特性,在使用,For() 方法时,在增加操作时,不会返回自增自段的实际值。

[Table("Products")]

public sealed class AzProducts

{

public int ProductID { get; set; }

...

}

当使用

AzProducts azProducts = new AzProducts { ProductName2 = "testvalue" };

var resultinsert = repository

.Insert()

.For(azProducts);

只会产生

INSERT [dbo].[Products]([ProductName],[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued])

VALUES('testvalue',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);

2、使用 DatabaseGenerated 特性,定义在System.ComponentModel.DataAnnotations中

[Table("Products")]

public sealed class AzProducts

{

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ProductID { get; set; }

...

}

会返回形如

INSERT [dbo].[Products]([ProductName],[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued])

VALUES('testvalue',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);

SELECT [ProductID],[ProductName] as ProductName2,[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued]

FROM [dbo].[Products]

WHERE [ProductID] = SCOPE_IDENTITY();

3、使用 IdentityField 特性,定义在SqlRepoEx.Core.CustomAttribute中

[TableName("Products")]

public sealed class AzProducts

{

[KeyField]

[IdentityField]

public int ProductID { get; set; }

...

}

同样会返回形如

INSERT [dbo].[Products]([ProductName],[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued])

VALUES('testvalue',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0);

SELECT [ProductID],[ProductName] as ProductName2,[SupplierID],[CategoryID],[QuantityPerUnit],[UnitPrice],[UnitsInStock],[UnitsOnOrder],[ReorderLevel],[Discontinued]

FROM [dbo].[Products]

WHERE [ProductID] = SCOPE_IDENTITY();

四、非字段属性

1、如果未使用任何特性,如下面属性 public string Supplier { get; set; }。此属性在数据库中无对应的字段

[Table("Products")]

public sealed class AzProducts

{

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ProductID { get; set; }

public string Supplier { get; set; }

...

}

当使用

var result = repository.Query();

会产生形如

select ProductID,Supplier ....

2、使用 NotMapped 特性,定义在System.ComponentModel.DataAnnotations中

[Table("Products")]

public sealed class AzProducts

{

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ProductID { get; set; }

[NotMapped]

public string Supplier { get; set; }

...

}

当使用

var result = repository.Query();

时,Supplier 不会出现在查询语句中,但要注意,当使用选择器来查询时,何然会出现在Select语句中;

如 var result = repository.Query().Select(c=>c.ProductID,c=>c.Supplier);

3、使用 NonDatabaseField 特性,定义在SqlRepoEx.Core.CustomAttribute中

[TableName("Products")]

public sealed class AzProducts

{

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ProductID { get; set; }

[NonDatabaseField]

public string Supplier { get; set; }

...

}

当使用

var result = repository.Query();

时,Supplier 不会出现在查询语句中,但要注意,当使用选择器来查询时,何然会出现在Select语句中;

如 var result = repository.Query().Select(c=>c.ProductID,c=>c.Supplier);

五、指定属性对应的数据库字段名

有时,类属性名与数据库中的字段名不完全是一一对应的,所以需要指定实际字段名

使用 Column 特性,定义在System.ComponentModel.DataAnnotations中,SqlRepoEx中没有对应的特性。

如下列类中的  ProductName2 属性,对应的数据库字段实为 ProductName

[TableName("Products")]

public sealed class AzProducts

{

[Key]

[DatabaseGenerated(DatabaseGeneratedOption.Identity)]

public int ProductID { get; set; }

[NonDatabaseField]

public string Supplier { get; set; }

[Column("ProductName")]

public string ProductName2 { get; set; }

...

}

轻量ORM-SqlRepoEx (十五)最佳实践之数据映射(Map)的更多相关文章

  1. 轻量ORM-SqlRepoEx (十三)最佳实践

    ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...

  2. 采用轻量ServiceMesh实现灰度发布的实践

    软件总会有缺陷的,解决问题的同时往往会引入新的问题,关键是看这些问题是否在我们的控制范围内,“灰度发布”就是让问题受控的方法之一. 前言 我们的 CTO 经常说:“研发团队最首要的任务是提供稳定的服务 ...

  3. 软件设计师【软件工程:软件开发模型、XP极限编程十二最佳实践】

    一.软件开发模型 二.XP极限编程十二最佳实践

  4. 轻量ORM-SqlRepoEx (十六)最佳实践之Dapper(2)

    简介:SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程 ...

  5. Dapper.NET——轻量ORM

    Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...

  6. SqlSugar轻量ORM

      蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...

  7. Dapper.NET—轻量ORM

    Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1  一 ...

  8. [转] Jenkins Pipeline插件十大最佳实践

    [From] http://blog.didispace.com/jenkins-pipeline-top-10-action/ Jenkins Pipeline 插件对于 Jenkins 用户来说可 ...

  9. 轻量ORM-SqlRepoEx (十四)最佳实践之Dapper(1)

    简介:SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程 ...

随机推荐

  1. codechef Many Lists(树状数组 set)

    题意 题目链接 Sol 直接做肯定不好搞(反正我不会..) 直接开\(n\)个Pair类型的set,维护每个数的出现位置 每次在set中二分后暴力合并即可 然后就是树状数组的基本操作了 时间复杂度:\ ...

  2. JavaWeb学习总结(十一):Session解决form表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  3. js笔记 -- toString() 和String()

    将一个值转换成一个字符串有两种方法,一是使用toString()方法,二是使用转型函数String().下面是一些需要注意的问题: 1,大多值都有toString()方法,因为toString是Obj ...

  4. webpack+vue2实现旅游网小demo

    这两天自己练习做了一个webpack+vue2的旅游app小项目,涉及到的内容是vue组件.vue路由以及webpack打包.         目录文件设计: 有兴趣的可到我的百度网盘下载 链接: h ...

  5. The String class's judging function

    字符串的判断功能: package com.itheima_03; /* * Object:是类层次结构中的根类,所有的类都直接或者间接的继承自该类. * 如果一个方法的形式参数是Object,那么这 ...

  6. JAVA后台框架优化之日志篇

    1.日志规范 各业务系统日志需要统一,以方便查看.收集日志, 日后统一ELK日志管理,以下为项目的日志配置, 这是兼容当前系统的日志,以后推行微服架构时会有变动,但日志存放方式不会改变,日后会推行sp ...

  7. 为什么懂云的IT高手能过得比你好

    盼望着,盼望着,一年一度的国庆7天长假还有不到24小时就到来了.各个部门的同事都已准备好满世界旅行去了. IT 部门各位同事的心还是悬着,信息系统还要持续的运转,对外的网站不能停,假期的线上促销也不能 ...

  8. PL/SQL编程基础——PL/SQL简介

    课程教师:李兴华 课程学习者:阳光罗诺 日期:2018-07-28 知识点: 1. 了解PL/SQL的主要特点 2. 掌握PL/SQL块的基本结构 PL/SQL PL/SQL是Oracle在关系数据库 ...

  9. Java SimpleDateFormat对象的parse方法处理12点变成00点

    原文链接:https://blog.csdn.net/chenbetter1996/article/details/82812959 new SimpleDateFormat("格式&quo ...

  10. Python学习---Django下的Sql性能的测试

    安装django-debug-tools Python学习---django-debug-tools安装 性能测试: settings.py INSTALLED_APPS = [ ... 'app01 ...