轻量ORM-SqlRepoEx (十五)最佳实践之数据映射(Map)
简介: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)的更多相关文章
- 轻量ORM-SqlRepoEx (十三)最佳实践
ORM-SqlRepoEx 是 .Net平台下兼容.NET Standard 2.0,一个实现以Lambda表达式转转换标准SQL语句,使用强类型操作数据的轻量级ORM工具,在减少魔法字串同时,通过灵 ...
- 采用轻量ServiceMesh实现灰度发布的实践
软件总会有缺陷的,解决问题的同时往往会引入新的问题,关键是看这些问题是否在我们的控制范围内,“灰度发布”就是让问题受控的方法之一. 前言 我们的 CTO 经常说:“研发团队最首要的任务是提供稳定的服务 ...
- 软件设计师【软件工程:软件开发模型、XP极限编程十二最佳实践】
一.软件开发模型 二.XP极限编程十二最佳实践
- 轻量ORM-SqlRepoEx (十六)最佳实践之Dapper(2)
简介:SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程 ...
- Dapper.NET——轻量ORM
Dapper.NET使用 http://www.cnblogs.com/yankliu-vip/p/4182892.html 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Da ...
- SqlSugar轻量ORM
蓝灯软件数据股份有限公司项目,代码开源. SqlSugar是一款轻量级的MSSQL ORM ,除了具有媲美ADO的性能外还具有和EF相似简单易用的语法. 学习列表 0.功能更新 1.SqlSuga ...
- Dapper.NET—轻量ORM
Dapper.NET使用 本文目录 Dapper.NET使用 1.为什么选择Dapper 2.以Dapper(4.0)为例. 2.1 在数据库中建立几张表. 2.2实体类. 3.使用方法 3.1 一 ...
- [转] Jenkins Pipeline插件十大最佳实践
[From] http://blog.didispace.com/jenkins-pipeline-top-10-action/ Jenkins Pipeline 插件对于 Jenkins 用户来说可 ...
- 轻量ORM-SqlRepoEx (十四)最佳实践之Dapper(1)
简介:SqlRepoEx是 .Net平台下兼容.NET Standard 2.0人一个轻型的ORM.解决了Lambda转Sql语句这一难题,SqlRepoEx使用的是Lambda表达式,所以,对c#程 ...
随机推荐
- 实现键盘记录的e.Whick和keyCode,兼容FireFox和IE
主要分四个部分第一部分:浏览器的按键事件第二部分:兼容浏览器第三部分:代码实现和优化第四部分:总结 第一部分:浏览器的按键事件 用js实现键盘记录,要关注浏览器的三种按键事件类型,即keydown,k ...
- Java 快速入门-06-JDK 目录文件说明
Java 快速入门-06-JDK 目录文件说明 JDK:开发环境,搞技术的人或者应用服务器使用 JRE:运行环境,如浏览器插件或者Swing界面的客户端等最终用户需要使用 JDK自含一个JRE,并依赖 ...
- spring mvc拦截器HandlerInterceptor
本文主要介绍springmvc中的拦截器,包括拦截器定义和的配置,然后演示了一个链式拦截的测试示例,最后通过一个登录认证的例子展示了拦截器的应用 拦截定义 定义拦截器,实现HandlerInterce ...
- Servlet映射规范和隐式映射
问题描述: web.xml中配置了缺省路径"/"后,原先在webapp下的静态页面(html)无法通过URL访问了,为什么? 过程尝试: 1. 将html后缀改为.jsp后可以正常 ...
- eclipse4.5(mars)环境
官网下载页面: http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/mars/2/ ...
- SQL函数应用-DATEPART()
作用:DATEPART() 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 语法格式:DATEPART(datepart,date) 参数说明: datepart 是指定应返回的日 ...
- 用canvas播放scratch文件
原文地址:https://blog.csdn.net/qq_36268036/article/details/84262540 基于Github上的scratch-render实现sb2或者sb3文件 ...
- os 模块 模块与包的初始
os模块是与操作系统交互的模块之前我们也用过os模块就是更改文件的名字的时候 我们如果用os求求文件夹是不行的 可以求文件 因为文件夹在python中最大就是4090个字节 所以你必须求出文件夹内 ...
- iOS9 News 应用
iOS9 News 应用 iOS9 中国区虽然没有 News 应用,但最新的开发工具中是有的,以下是笔者截取的模拟器gif图,供君欣赏:
- Java学习---Pinyin4j使用手册
一般用法 pinyin4j的使用很方便,一般转换只需要使用PinyinHelper类的静态工具方法即可: String[] pinyin = PinyinHelper.toHanyuPinyinStr ...