手撸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 ...
随机推荐
- Cypress系列(44)- 命令行运行 Cypress
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 前言 前面也介绍过 Cypress 命令 ...
- openshift 4.3中安装helm3并通过helm方式部署应用
openshift 4.3中安装helm3并通过helm方式部署应用 简介 Helm是一个命令行界面(CLI)工具,可简化将应用程序和服务部署到OpenShift Container Platform ...
- db2错误代码可能的原因
一. SQL5005C运行cmd未用管理员权限打开 SQLCODE-303 数据类型不兼容 SQLCODE-305 查出的数据有NULL未处理直接写入接收变量 二.应该不会有人直接写sql用这个 ...
- Node.js连接MongoDB数据库
首先要启动MongoDB服务器 先找到你的mongoDb安装目录,我的如下:就在bin文件夹下创建一个data文件夹,data内包含两个空文件夹,如下: 接着回到bin文件夹处,按住shift键,右击 ...
- Python实现加密压缩成RAR或ZIP文件
博主在前两篇博文分别介绍了加密RAR文件的解压https://www.cnblogs.com/kangbazi666/p/13646308.html和加密ZIP文件的解压https://www.cnb ...
- Sql Server中使用特定字符分割字符串
在T-SQL中我们经常批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.这里将字符串分割以table形式输出 语法如下: SET ANSI_NUL ...
- [LeetCode]1071. 字符串的最大公因子(gcd)
题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...
- java Spring系列之 配置文件的操作 +Bean的生命周期+不同数据类型的注入简析+注入的原理详解+配置文件中不同标签体的使用方式
Spring系列之 配置文件的操作 写在文章前面: 本文带大家掌握Spring配置文件的基础操作以及带领大家理清依赖注入的概念,本文涉及内容广泛,如果各位读者耐心看完,应该会对自身有一个提升 Spri ...
- [记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题
[记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题 目录 [记录点滴]授人以渔,从Tensorflow找不到dll扩展到如何排查问题 0x00 摘要 0x01 引言 0x02 ...
- 如何成为一位优秀的ScrumMaster
嗨,大家好,我是叶子 背景介绍 目标:为了能更好的适应快速变化的需求和不确定的未来. 部门包含岗位:部门负责人.项目经理.产品经理.开发团队(开发人员.测试人员) 那么这种情况下,我们想转型Scrum ...