前言

还记得当初学习数据库操作时,用ADO.NET一步一步地进行数据操作及查询,对于查询到的数据还得对其进行解析,然后封装返回给应用层;遇到这种重复而繁琐的工作,总有一些大神或团队对其进行封装,从而出现了很多ORM框架,让小伙伴把更多精力放在业务处理上,同时更多的面向程序对象开发,对工作效率的提升有很大的帮助。

目前关于C#出现了很多ORM框架,比较流行的大概有FreeSql (国内)、SqlSugar (国内)、Dapper (国外)、EF/EF Core (国外)、linq2db (国外)等,

当然也有一些小伙伴对其进行性能比较,各有优势吧。从我个人及周围的小伙伴使用来看,EF/EF Core和Dapper使用率相对比较高。这里就先说说EF Core,后续逮住机会再和小伙伴一起分享其他;

正文

随着.NetCore的迅速推进,EF Core也紧跟其步伐。目前长期支持版本是EF Core3.1,而下一个稳定版本EF Core5.0将计划随.Net5一起发布,预计应该会在这个月(2020年11月),可见微软对EF Core是非常重视的;

对于之前用过EF的小伙伴,应该都知道,EF有三种开发模式:CodeFirst、ModelFirst、DbFirst,这三种根据业务需求及个人偏好用的相对比较多的是DbFirst和CodeFirst;现在EF Core推荐使用CodeFirst的方式进行项目开发,当然也可以通过反向工程的方式,以数据库设计为先。这里都会针对这两种方式进行举例演示;

在项目中使用CodeFirst方式,这里用的数据库是VS自带的LocalDb,项目还是老规矩,一个WebApi项目;既然实战入门,肯定得有点样子才对,所以这里就简单模仿了三层架构的形式进行举例演示,如下项目结构:

项目依赖如下:

  • EFCoreTestDemo API项目依赖EFCoreTestModel和EFCoreTestService项目;
  • EFCoreTestService 服务层项目依赖EFCoreTestModel和EFCoreTestRespository项目;
  • EFCoreTestRespository 数据层依赖EFCoreTestModel项目

结构好了,现在开始敲代码,比如模拟用户维护的增删改查吧; 既然是CodeFirst,先暂时把数据库放一边。 如下步骤开始:

  1. 做用户维护,肯定得有用户实体,先在Model层中增加一个用户类;

  2. 接下来就要对数据进行操作,就是所谓的增删改查,既然用到EF,肯定得有一个DbContext,这个和数据存储有关,所以将其放在数据层;

  3. 其实到这一步,我比较喜欢先迁移一下,看看是否有问题,能否正常生成数据库和对应的表;(其实这里可以不用急着迁移,继续编码的,但提前把问题扼杀在摇篮中是很不错的想法);

    既然要迁移,肯定得把数据的连接字符串传过去,这里是从WebApi项目的Startup中注册服务时进行传递,并指定迁移程序为WebApi项目:

    上图中数据库连接字符串从何而来的,自己写的吗?哈哈哈,拷贝过来的,这里顺便把之前创建的数据库都删了,方便测试,如下图:

    迁移方式有两种,一种是命令行的形式,另一种是在VS中的包管理器控制台(PMC)进行;

    命令行方式:需要安装命令行工具,这里使用全局安装方式,如下命令:dotnet tool install --global dotnet-ef

    在指定的迁移程序集中安装Microsoft.EntityFrameworkCore.Design,否则迁移不成功。迁移过程如下图:

    包管理器控制台(PMC)方式进行迁移:需要在指定的迁移程序集中安装Microsoft.EntityFrameworkCore.Tools包,否则迁移失败:

  4. 迁移没问题,继续回到代码逻辑;现在应该开始编辑业务代码,即对用户的增删改查,先从数据层开始吧,具体步骤见下图编号:

    业务层:

    控制器:

    使用自带依赖注入:

  5. 剩下的就是运行看结果啦,这里没有继承Swagger,使用Postman工具进行测试,如下图:

通过以上步骤,使用EF Core的CodeFirst 从创建实体->迁移->最后业务编写的流程基本就是这样啦;后续如果新增实体,还是重复以上步骤。说完流程,接着说说上面过程中其他技术点↓↓↓

增删改查操作

增加用户案例,首先将原有对象进行包装,然后通过标识包装对象的状态,最后通过SaveChanges进行统一执行操作,如下:

用户的删除、更新与新增时同样的道理,如下:

查询,一般通过DbContext自带方法、Lamda表达式,或是Linq语句,同样查出可追踪的包装对象,但是可以将其查询设置为不可追踪,有时候为了提高性能,会针对进行设置或整体设置:

整体设置不追踪:

迁移命令

上面说到的迁移命令只有新增迁移和更新数据库,还有一些常用的指令也比较常用,如下:

通常,生成环境下一般都会采用脚本的方式生成数据库和表,那开发的时候是通过命令进行的,如何生成对应的脚本呢? 如下图:

对于删除迁移的场景,一般会是对当前迁移不满意,比如字段写错了、类型误用等情况,如下:

如上图,新增迁移已经完成了,但是由于Age使用的类型不对,要废弃这次迁移,重新进行迁移,当然也不可以不删除,但对后续查询历史迁移记录的时候会产生误解。如下删除最近一次迁移,如下:

表问题

在上面迁移的过程中,并没有指定表明和字段及设置对应的列类型,是EF Core框架按照默认规则,自动帮我们生成了,是不是很贴心,但是既然是默认,框架肯定不知道我们到底需要什么,如下生成的表:

如上图所示,EF Core框架默认将类名作为表明,生成的字符串长度都默认为最大,这些肯定不是我们想要的,所以作者肯定想到这,给我们提供了修改的方法,我们通常会采用注解的方式或是FluentApi的形式进行约束和更改,注解直接在对应列上标注,但一般会推荐使用FluentApi,相对比较灵活;在DbContext中的OnModelCreating中编写对应代码即可,如下:

然后重新迁移并更新到数据库,如下:

Linq查询

EF使用的过程中,Linq应该是少不了的,估计有小伙伴会说,直接用DbContext中提供的方法和Lamda表达式就行啦,是,那肯定是可以的,只能说还没用到精髓,哈哈哈,面向代码编程的SQL查询语句,用起来是很方便的,如下:

是不是看起来像SQL,虽然说是Linq新语法,但看着不陌生,用着也很方便;这里不打算深入说,只是给小伙伴们提上一嘴;那么无情吗?当然不,我把之前收集到的Linq文档已经上传,小伙伴们可以参考一下:

官方文档:https://docs.microsoft.com/zh-cn/dotnet/csharp/linq/

收集文档:

链接:https://pan.baidu.com/s/1BZivBXG9WT-gOqsXKG08Ng

提取码:9qyu

反向工程(先有数据库设计,然后根据数据库生成对应Model)

对于一些项目,当小伙伴们接到手时候已经把数据库设计好了,这种情况没必要犟着一个一个实体敲,重新生成数据库,完全可以通过数据库反向生成代码,反正怎么方便就怎么来;还有一种情况就是很多小伙伴还是比较喜欢数据库优先的开发模式,直接反向工程就好啦;

这里用之前创建的数据和User表,然后建了一个test项目,里面只安装了EF Core的核心包和Design包,如下:

同样使用命令行或包管理控制台都行,这里就使用命令行,在test项目目录下执行以下命令(这里是SqlServer,还需要安装Microsoft.EntityFrameworkCore.SqlServer包):

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=EFCoreTest1;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False" "Microsoft.EntityFrameworkCore.SqlServer" -o ./Models --context EFCoreTestContext  --context-dir ./ -f

以上命令简单说明:

dotnet ef dbcontext scaffold后面指定数据库连接字符串;

第二个参数代表是对应数据库指定的Provider,及对应数据库对应的Nuget包;

-o:代表是生成的实体类存放的位置;

--context:生成的dbContext的类名称;

--context-dir:指定生成的dbContext存放的位置;

-f:覆盖现有文件;

-v:显示迁移过程及报错信息;

-t:指定表反向生成代码,如果不指定代表所有表都生成;

-n:指定生成类名的命名空间,这个EF Core5.0提供;

—context-namespace:指定生成DbContext的命名空间,这个EF Core5.0提供;

注:生成的类和DbContext可以根据参数最终生成到对应位置,满足自己需求。

如果是MySql,需要安装Pomelo.EntityFrameworkCore.MySql包,其他步骤都一样,这里就不演示了,就留给小伙伴练习吧;真的不要嫌简单,只有亲手做了,遇到问题,然后解决,最终才能提升,亲身体会。

总结

这里只是简单说说EF Core的使用,迁移流程及反向工程操作分享,其他的进阶使用会陆续分享,小伙伴们也可以自己去加强,我这里有的资源,都会进行分享;说到这,后续文件下载地址大家只能在公众号聊我啦,前两篇由于博文带文件下载地址,有些博客平台把我禁言了,很是尴尬,不过修改申诉过啦。

博文源代码github地址:https://github.com/zyq025/DotNetCoreStudyDemo

一个被程序搞丑的帅小伙,关注"Code综艺圈",识别关注跟我一起学~~~

撸文不易,莫要白瞟,三连走起~~~~

跟我一起学.NetCore之EF Core 实战入门,一看就会的更多相关文章

  1. 跟我一起学.NetCore之MVC过滤器,这篇看完走路可以仰着头走

    前言 MVC过滤器在之前Asp.Net的时候就已经广泛使用啦,不管是面试还是工作,总有一个考点或是需求涉及到,可以毫不疑问的说,这个技术点是非常重要的: 在之前参与的面试中,得知很多小伙伴只知道有一两 ...

  2. 从零开始搭建前后端分离的NetCore(EF Core CodeFirst+Au)+Vue的项目框架之二autofac解耦

    在 上一篇 中将项目的基本骨架搭起来能正常跑通,这一篇将讲到,如何通过autofac将DbContext和model进行解耦,只用添加model,而不用在DbContext中添加DbSet. 在这里就 ...

  3. 张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

    写在前面 Entity Framework Core (EF Core) 是 .NET 平台流行的对象关系映射(ORM)框架.虽然 .NET 平台中 ORM 框架有很多,比如 Dapper.NHibe ...

  4. 基于EF Core的Code First模式的DotNetCore快速开发框架

    前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...

  5. EF Core 快速上手——EF Core 入门

    EF Core 快速上手--EF Core 介绍 本章导航 从本书你能学到什么 对EF6.x 程序员的一些话 EF Core 概述 1.3.1 ORM框架的缺点 第一个EF Core应用   本文是对 ...

  6. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  7. EF Core 数据库迁移(Migration)

    工具与环境介绍 1.开发环境为vs 2015 2.mysql EF Core支持采用  Pomelo.EntityFrameworkCore.MySql   源代码地址(https://github. ...

  8. 在.NET Core类库中使用EF Core迁移数据库到SQL Server

    前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...

  9. EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    前言 终于踏出第一步探索EF Core原理和本质,过程虽然比较漫长且枯燥乏味还得反复论证,其中滋味自知,EF Core的强大想必不用我再过多废话,有时候我们是否思考过背后到底做了些什么,到底怎么实现的 ...

随机推荐

  1. 【题解】一本通例题 S-Nim

    \(\color{purple}{Link}\) \(\text{Solution:}\) 这个题就是给\(Nim\)游戏做了一个限制. 考虑一下\(\text{SG}\)函数:给定的局面下对应的\( ...

  2. 带着好奇心去探索IDEA

    带着好奇心去探索IDEA 工欲善其事必先利其器 软件是提高工作效率的工具.所以了解工具的特性,操作方式,能更好地使用它.一般使用掌握逻辑: 第一步:了解菜单栏-工具栏-其他窗口: 第二步:实战,真正利 ...

  3. C# OOP编程

    1:面向对象的概念:什么是类.对象.以及类与对象的关系. 面向对象三大特征: 封装/继承/多台 2:封装性: 用访问修饰符来体现封装性. Public 公共的/ private 私有的/Protect ...

  4. docker容器命令2

    docker容器命令2 启动守护式容器 docker run -d 镜像名字 [root@tzh ~]# docker images REPOSITORY TAG IMAGE ID CREATED S ...

  5. 2014年 实验二 B2C网上购物

    实验二 B2C网上购物 [实验目的] ⑴.熟悉虚拟银行和网上支付的应用 ⑵.熟悉并掌握消费者B2C网上购物和商家的销售处理 [实验条件] ⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网 (3) ...

  6. 多测师讲解python函数 _zip_高级讲师肖sir

    # zip函数 #zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存.1.使用zip讲两个列表打印出来的结果是 ...

  7. Termux基础教程(一):技能部署

    Termux基础教程 by CUCI Termux 是一个 Android 下一个高级的终端模拟器,开源且不需要 root,支持 apt 管理软件包,十分方便安装软件包,完美支持 Python. PH ...

  8. pytest文档43-元数据使用(pytest-metadata)

    前言 什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助. pytest 框架里面的元数据可以使用 pytest-metadata 插件实现.文档地址http ...

  9. 程序员,想被别人发掘?那你有 freestyle 吗?

    程序员群体是偏内向的,整天和计算机打交道,用代码说话,接受任务,默默工作. 如果这些任务是有挑战性的还行,你的工作成果就能帮你说话,可是大部分工作都是普普通通的,甚至有点儿重复性的劳动. 这个时候表面 ...

  10. zookeeper的管理功能

    一,查看当前zookeeper的版本 [liuhongdi@localhost ~]$ echo stat|nc 127.0.0.1 2181 Zookeeper version: 3.5.6-c11 ...