手撸ORM浅谈ORM框架之基础篇
好奇害死猫
一直觉得ORM框架好用、功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! 随着发际线后移高亮意识到优秀程序员写的优秀的ORM框架会做一些Sql优化,Sql优化不是一成不变的,ORM框架不会根据项目业务场景等主动优化Sql语句。如果ORM真的强大的到开发人员不需要关注Sql,会针对当前项目情况做出相对应很好的优化,必然会增加ORM框架的体积、带来性能等相关问题。知己知彼,百战不殆。一直想探索ORM原理,为什么调用ORM Add或Insert方法都可以把实体写入到数据库???由于好奇之心我准备写一个ORM系列随笔,浅谈对ORM的理解,作者水平有限欢迎园友纠正错误及不恰当之处。
千里之行始于足下
ORM对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
技术栈: .NET Core 3.1 + MySql + Autofac + Swagger
官方地址传送:
微软NET Core 3.1: 中文https://docs.microsoft.com/zh-cn/dotnet/ 英文https://docs.microsoft.com/en-us/dotnet/
MySql 8.x 文档: https://dev.mysql.com/doc/
Autofac文档: 中文https://autofaccn.readthedocs.io/zh/latest/ 英文https://autofaccn.readthedocs.io/en/latest/
Swagger文档: https://swagger.io/docs/
目前计划
手撸ORM浅谈ORM框架之Add篇
手撸ORM浅谈ORM框架之Update篇
手撸ORM浅谈ORM框架之Delete篇
手撸ORM浅谈ORM框架之Query篇
后续待定。。。。。。
MySql 8.x 坎(待解决)
//Grant all privileges on learndb.* to 'learn_user@'@'%'
//> 1410 - You are not allowed to create a user with GRANT
//Sql = @"CREATE DATABASE IF NOT EXISTS learndb;"
因此,权限需要先手动授予: 服务器权限-》Create
注:遇到的项目中一般都是数据库优先或者使用的EntityFramework来创建数据库,MySql8.x命令授权给用户不太熟练。
新风尚WebApi
.NET Framework使用静态资源除了保护文件夹可以直接添加需要的静态资源文件夹即可;.NET Core使用静态文件需要在Startup-》Configure 方法中启用静态文件UseStaticFiles并且文件夹的名称:wwwroot,否则禁止访问静态资源。WebApi添加wwwroot文件夹存放静态资源,.Net Core中需要手动添加swagger静态样式资源,下载地址 : swagger-ui ,您也可以使用项目中的wwwroot里面的样式。
Api神器Swagger
Startup-》ConfigureServices 方法中添加Swagger 文档doc、xml、security等信息。新版本Swashbuckle.AspNetCore.Swagger有一些改动,例如SwaggerDoc-》OpenApiInfo的属性TermsOfService由String修改为Uri,在对TermsOfService赋值时如果非Uri或String无法转换正确的Uri项目Debug时会抛出下面异常。
System.UriFormatException
HResult=0x80131537
Message=Invalid URI: The format of the URI could not be determined.


- 1 private const string ProjectName = "Learn.WebApi";
- 2
- 3 // This method gets called by the runtime. Use this method to add services to the container.
- 4 public void ConfigureServices(IServiceCollection services)
- 5 {
- 6 #region Swagger
- 7
- 8 services.AddSwaggerGen(c =>
- 9 {
- 10 c.SwaggerDoc("v1", new OpenApiInfo
- 11 {
- 12 Title = ProjectName,
- 13 Version = "v1",
- 14 Description = $"{ProjectName} HTTP API ",
- 15 TermsOfService = new Uri("https://github.com/dingshuanglei"),
- 16 Contact = new OpenApiContact { Name = "丁双磊", Email = "shuangleiding@163.com", Url = new Uri("https://github.com/dingshuanglei") }
- 17 });
- 18
- 19 var basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
- 20 var xmlPath = Path.Combine(basePath, $"{ProjectName}.xml");
- 21 c.IncludeXmlComments(xmlPath, true);
- 22 var modelXmlPath = Path.Combine(basePath, "Learn.Model.xml");
- 23 c.IncludeXmlComments(modelXmlPath, true);
- 24
- 25 // Add security definitions
- 26 c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
- 27 {
- 28 Description = "Please enter into field the word 'Bearer' followed by a space and the JWT value",
- 29 Name = "token",
- 30 In = ParameterLocation.Header,
- 31 Type = SecuritySchemeType.ApiKey,
- 32 });
- 33 c.AddSecurityRequirement(new OpenApiSecurityRequirement
- 34 {
- 35 {
- 36 new OpenApiSecurityScheme
- 37 {
- 38 Reference = new OpenApiReference()
- 39 {
- 40 Id = "Bearer",
- 41 Type = ReferenceType.SecurityScheme
- 42 }
- 43 }, Array.Empty<string>()
- 44 }
- 45 });
- 46 });
- 47
- 48 #endregion
- 49
- 50 #region db init
- 51
- 52 InitDbTable.InitTable();
- 53
- 54 #endregion
- 55
- 56 services.AddControllers();
- 57 }
Startup-》Configure 方法中启用Swagger和静态文件UseStaticFiles。


- 1 // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- 2 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
- 3 {
- 4 if (env.IsDevelopment())
- 5 {
- 6 app.UseDeveloperExceptionPage();
- 7 }
- 8
- 9 app.UseRouting();
- 10
- 11 #region Swagger
- 12 app.UseSwagger();
- 13 app.UseSwaggerUI(c =>
- 14 {
- 15 c.SwaggerEndpoint("/swagger/v1/swagger.json", $"v1");
- 16 c.RoutePrefix = string.Empty;
- 17 });
- 18 #endregion
- 19
- 20 app.UseAuthorization();
- 21
- 22 //使用静态文件
- 23 app.UseStaticFiles();
- 24
- 25 app.UseEndpoints(endpoints =>
- 26 {
- 27 endpoints.MapControllers();
- 28 });
- 29 }
Program-》CreateHostBuilder 方法中将默认ServiceProviderFactory指定为AutofacServiceProviderFactory。


- 1 public static IHostBuilder CreateHostBuilder(string[] args) =>
- 2 Host.CreateDefaultBuilder(args)
- 3 //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
- 4 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
- 5 .ConfigureWebHostDefaults(webBuilder =>
- 6 {
- 7 webBuilder.UseStartup<Startup>();
- 8 });
Autofac Ioc
Startup-》添加ConfigureContainer方法注入需要Ioc管理的类及类库,当前项目中使用的注入没有特殊的需求,普通的注入业务层和数据访问层类库,也可以根据您自身项目的需要指定注入的生命周期、单接口多实现等等。


- 1 /// <summary>
- 2 /// autofac ioc
- 3 /// </summary>
- 4 /// <param name="builder"></param>
- 5 public void ConfigureContainer(ContainerBuilder builder)
- 6 {
- 7 //使用单例模式
- 8 //builder.RegisterType<Test>().As<ITest>().SingleInstance().PropertiesAutowired();
- 9
- 10 //单接口多实现
- 11 //builder.RegisterType<TestOne>().Named<ITest>(nameof(TestOne));
- 12 //builder.RegisterType<TestTwo>().Named<ITest>(nameof(TestTwo));
- 13
- 14 Assembly[] assembliesService = new Assembly[] { Assembly.Load("Learn.Service") };
- 15 builder.RegisterAssemblyTypes(assembliesService).Where(type => !type.IsAbstract && typeof(IocService).IsAssignableFrom(type)).AsImplementedInterfaces().PropertiesAutowired();
- 16
- 17 Assembly[] assembliesRepository = new Assembly[] { Assembly.Load("Learn.Repository") };
- 18 builder.RegisterAssemblyTypes(assembliesRepository).Where(type => !type.IsAbstract).AsImplementedInterfaces().PropertiesAutowired();
- 19 }
代码下载地址: SourceCode 作者水平有限欢迎园友纠正错误及不恰当之处,予以及时修正以免误导他人!
手撸ORM浅谈ORM框架之基础篇的更多相关文章
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Update篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸基于swoole 的分布式框架 实现分布式调用(20)讲
最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...
- ABP框架实践基础篇之开发UI层
返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 说明 其实最开始写的,就是这个ABP框架实践基础篇.在写这篇博客之前,又回头复习了一下ABP框架的理论,如果你还没学习,请查看AB ...
- 【SSH学习笔记】浅谈SSH框架
说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...
- 13.Object-C--浅谈Foundation框架常用的结构体
------- android培训.iOS培训.期待与您交流! ---------- 昨天学习了Foundation框架中常用的结构体,下面我简单的总结一下,如果错误麻烦请留言指正,谢谢! Found ...
- 浅谈chainer框架
一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...
随机推荐
- 用于测试XmlAnalyzer 1.00版的八个测试用例
XmlAnalyzer 工程目的:将XML的属性和子节点按字母序排列,然后整形输出: 08. 原文=<project xmlns="http://maven.apache.org/PO ...
- SEDA架构实现
一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...
- IDEA项目左侧目录看不到target
点击如下图所示图标,然后选择Show Excluded Files后即可出现
- 教务管理系统(node+express+mysql)
模块拆分 现在将教务系统拆分成九个模块: 教务系统教师业务:师资管理.教学计划管理.排课管理 教务系统学生业务:考试管理.毕业生管理.学生综合测评 信息查询:自习室查询.课程表查询 考试系统:实现学生 ...
- Linux rndis_host 驱动的一个BUG与解决方案
关键字 rndis_host, linux, kernel, modem 综述 rndis 是微软定义的一套通讯方案.类似的协议还有 qmi/mbim/ecm/ncm. rndis 协议足够简单,可靠 ...
- SpringCloud实战 | 第一篇:Windows搭建Nacos服务
前言 为什么放弃eureka选择nacos?本地开发环境需要搭建nacos-server,想着是很简单的事但是被一些文章(少了关键必要的步骤)给带偏了,所以亲测成功后写了这篇文章. 搭建nacos-s ...
- openstack核心组件——cinder存储服务(11)
一.cinder 介绍: 理解 Block Storage 操作系统获得存储空间的方式一般有两种: 通过某种协议(SAS,SCSI,SAN,iSCSI 等)挂接裸硬盘,然后分区.格式化.创建文件系 ...
- mysql之慢日志查询
转自https://my.oschina.net/wuweixiang/blog/2987434 首先得配置my.cnf: #===================================== ...
- C++ (C#)实现获取NX PART预览图
VS环境下 C++版本: 1 int GetPreviewImage(const TCHAR* prtFile, const TCHAR* imageFile) 2 { 3 IStorage* pSt ...
- Java源码赏析(六)Java String 三顾
在大致了解了String之后,可能有的读者发现了,我们并没有谈到CharSequence接口. 原因是在这一节,CharSequence要和StringBuilder(Java1.5).StringB ...