基于.NET实现高效ORM自定义开发
学习视频链接
https://www.bilibili.com/video/BV1zT4y137TR?p=1
常老师讲解的通俗易懂
一、关于ORM
ORM:(Object Relation Mapping) 对象关系映射
因为我们开发的软件绝大部分是基于数据库开发的,因此一定会涉及到数据库访问技术
在.NET平台典型的数据库访问技术是基于ADO.NET,特点是效率非常高,但是在开发的效率上有局限性
ORM框架解决的问题:为开发者自动生成AQL语句和参数封装的任务
其他ORM框架:EF6.0 EFCore 自己写一个OEM框架(功能没那么强大,但是足够项目使用)
第三方的:Dapper.Net(.NETCore) 非常流行,原因是轻量级
二、框架的设计
1、框架的目的:帮我们自动生成SQL语句和参数封装
2、如何生成SQL语句?如何封装参数?
思路1:我们使用ORM框架的有哪些条件可以利用?
实体类是数据表的映射,也就是说,如果我们知道一个实体类,我们就可以明确这个实体类对应的数据表的所有字段的名称、数据类型、数据表名称
思路2:如何将一个实体类的这些内容解析出来?如果实体类中包括数据表中没有的字段,如何处理?
解决方法1:反射技术可以给我们提供所需要的的全部信息
解决方法2:给不需要的属性打上“标签”,在C#程序中使用的就是特性。
特性是?特性一种类,能够发到类、属性、方法上边。用来标识这个类、属性或者方法的特殊用途
三、框架的实现
1、创建特性类,给属性打上标签
思考:我们需要什么样的特性?(特性必须专用)
在update或者delete的时候,需要根据主键
扩展属性特性:ExtendPropertyAttribute
剔除标识列的特性:IdentityAttribute
主键:PrimaryKeyAttribute
2、根据已经设计好的带着特性的实体类,生成SQL语句和参数
记住:在所有的ORM框架中,会有一个DBContext类,叫做数据库上下文类,
实现自动的insert update delete select
以实现自动insert为例:
public int InsertModel(Object model)
{
//[1]获取实体对象的属性数组(属性名称、属性数据类型、属性值)
PropertyInfo[] proArry = model.GetType().GetProperties();
//[2]组合SQL语句
StringBuilder sqlFiled = new StringBuilder($"insert into {model.GetType().Name} (");
StringBuilder sqlValues = new StringBuilder(" values (");
List<SqlParameter> paramList = new List<SqlParameter
//[3] 找到要过滤的字段
//[4]组合sql语句
retrun 0;
}
四、框架设计也有局限性
第一,任何框架都有自己的优势和不足,不要认为框架的功能是完美的
第二,我们必须学会使用.NET自带的EF,同时也得会使用第三方的,最后还要自己熟练写一个
实际开发中,可以根据自己的需要,选择合适的