杨中科 .NETCORE EFCORE 第一部分 基本使用

一 、什么是EF Core

什么是ORM

1、说明: 本课程需要你有数据库、SOL等基础知识。
2、ORM: ObjectRelational Mapping。让开发者用对象操作的形式操作关系数据库
比如插入:

User user = new User(Name="admin"Password="123”;
orm.Save(user);

比如查询:

Book b = orm.Books.Single(b=>b.Id==3||b.Name.Contains(".NET"));
string bookName = b.Name;
string aName = b.Author.Name;

3、有哪些ORM: EF core(官方推荐)、Dapper、SqlSugar、FreeSql等

EF Core与其他ORM比较

1、Entity Framework Core(EF Coxe)是微软官方的ORM框架优点: 功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;
缺点: 复杂、上手门槛高、不熟悉EFCore的话可能会进坑。

2、Dapper。优点: 简单,N分钟即可上手,行为可预期性强;
缺点:生产效率低,需要处理底层数据库差异。

3、EF Core是模型驱动(Model-Driven)的开发思想,Dapper是数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。

4、性能: Dapper≠性能高; EF Core≠性能差。

5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。

选择

1、个人建议(仅供参考): 对于后台系统、信息系统等和数据库相关开发工作量大的系统,且团队比较稳定,用EF Core;对于互联网系统等数据库相关工作量不大的系统,或者团队不稳定,用Dapper
2、在项目中可以混用,只要注意EF Core的缓存、Tracking等问题即可。

EF Core与EF比较

1、EF有DB First、ModelFirst、Code First。EF Core不支持模型优先,推荐使用代码优先,遗留系统可以使用Scaffold-DbContext来生成代码实现类似DBFirst的效果,但是推荐用Code First .
2、EF会对实体上的标注做校验,EF Core追求轻量化,不校验
3、熟悉EF的话,掌握EFCore会很容易,很多用法都移植过来了。EF Core又增加了很多新东西。
4、EF中的一些类的命名空间以及一些方法的名字在EF Core中稍有不同。
5、EF不再做新特性增加。

搭建 EFCORE 环境

用什么数据库

1、EF Core是对于底层ADO.NET Core的封装,因此ADO.NET Core支持的数据库不一定被EF Core支持。
2、EF Core支持所有主流的数据库,包括MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite等。可以自己实现Provider支持其他数据库。国产数据库支持问题。3、对于SQLServer支持最完美,MySQL、PostgreSQL也不错 (有能解决的小坑) 。这三者是.NET圈中用的最多的三个。本课程主要用SOLServer讲,如果用其他数据库只要改行代码+绕一些小坑即可,大部分代码用法不变。EFCore能尽量屏蔽底层数据库差异。

开发环境搭建

1、经典步骤:建实体类;
建DbContext;
生成数据库;
编写调用EF Core的业务代码。
2、Book.cs

public class Book
{public long Id { get; set; )//主键public string Title { get; set; )//标题public DateTime PubTime { get; set;}//发布日期public double Price { get; set;}//单价
}

3、Install-Package Microsoft.EntityFrameworkCore.SqlServer(这个包依赖了efcore的包,所以不需要在单独安装ef的包)

具体实现

  1. 新建Book、Person 类
    在这里插入图片描述
    在这里插入图片描述

  2. 安装程序包
    在这里插入图片描述

开发环境搭建2

创建实现了IEntityTypeConfiguration接口的实体配置类,配置实体类和数据库表的对应关系
Book

class BookEntityConfig:IEntityTypeConfiguration<Book>
{public void Configure(EntityTypeBuilder<Book> builder){builder.ToTable("T_Books");}}

Person

class BookEntityConfig:IEntityTypeConfiguration<Person>
{public void Configure(EntityTypeBuilder<Book> builder){builder.ToTable("T_Persons");}}

浅谈这里的约定大约配置

1.新建BookConfig类 实现 IEntityTypeConfiguration
在这里插入图片描述

列名会根据约定 根据实体类中的数据自动生成

在这里插入图片描述

开发环境搭建3

创建继承自DbContext的类

class TestDbContext:DbContext
{// 有哪些实体public DbSet<Book> Books { get; set; }public DbSet<Book> Persons { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){//连接数据库string connStr ="Server=.;Database=demol;Trusted_Connection=True;MultipleActiveResultSets=true";optionsBuilder.UseSqlServer(connStr);}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);//从当前程序集加载 上一步中 所有实现 IEntityTypeConfiguration<T>的类modelBuilder.ApplyConfigurationsFromAssembly(this.GetType()Assembly);}}

概念: Migration数据库迁移

面向对象的ORM开发中,数据库不是程序员手动创建的,而是由Migration工具生成的。关系数据库只是盛放模型数据的一个媒介而已,理想状态下,程序员不用关心数据库的操作。
根据对象的定义变化,自动更新数据库中的表以及表结构的操作,叫做Migration (迁移)迁移可以分为多步 (项目进化) ,也可以回滚。

开发环境搭建4-Migration

为了使用生成数据库的工具,Nuget安装否则MicrosoftEntityFrameworkCore.Tools,
否则执行Add_Migration等命令会如下报错
在这里插入图片描述
在这里插入图片描述

开发环境搭建4-Migration

1、再在“程序包管理器控制台”中执行如下命令Add-Migration InitialCreate(取版本名,方便回滚)
会自动在项目的Migrations文件夹中中生成操作数据库的C#代码。讲解一下生成代码的作用。InitialCreate是什么?
2、代码需要执行后才会应用对数据库的操作。“程序包管理器控制台”中执行Update-database。
3、查看一下数据库,表建好了。

1.在这里插入图片描述
此时项目中多出一个Migrations文件
在这里插入图片描述

打开文件查看

在这里插入图片描述

在这里插入图片描述

此时刷新数据库 发现表已经创建完成
在这里插入图片描述

在这里插入图片描述

开发环境搭建5-修改表结构

1、项目开发中,根据需要,可能会在已有实体中修改、新增、删除表、列等。
2、想要限制Title的最大长度为50,Title字段设置为“不可为空”,并且想增加一个不可为空且最大长度为20的AuthorName(作者名字)属性。
首先在Book实体类中增加一个AuthorName属性
3、修改BookEntityConfig

builder.ToTable("T Books");
builder.Property(e => e.Title).HasMaxLength(50).IsRequired();
builder.Property(e =>e.AuthorName).HasMaxLength(20).IsRequired();

4、执行Add-Migration AddAuthorName ModifvTitle。取名字有意义
5、Update-Database

演示:

新增表字段

1.在person中 新建BirthPlace属性
在这里插入图片描述
2.执行Add-Migration + name
在这里插入图片描述

此时Migrations中新生成一个 …AddBirth文件,除了日期之外,编号更大

在这里插入图片描述
查看文件内容
在这里插入图片描述

3.验证Update-Database 是编译代码之后在执行,故意添加一行错误代码在执行
在这里插入图片描述

运行结果:

在这里插入图片描述

去掉错误代码,在执行

在这里插入图片描述

运行成功 ,查看数据库表

在这里插入图片描述

添加成功。

修改表字段属性

在这里插入图片描述
发现此时该字段,允许为空,且长度限制为最大程度(因为实体类中为String,String 是可以为空得,长度也不知道为多少)。是不合理得设计。

想要限制Title的最大长度为50,Title字段设置为“不可为空”,并(作者名字)属且想增加一个不可为空且最大长度为20的AuthorName性。

1.在Person中添加新列
在这里插入图片描述

2.修改BookConfig文件
在这里插入图片描述

3.新增dog类
在这里插入图片描述
为了和Dbcontext产生关系,必须加入到 MyDbContext配置类中,才能和数据库产生关系
在这里插入图片描述

4.执行
在这里插入图片描述
【警告】
可能会产生数据丢失(原本长度为不限制,现在改为不限制,)

5.继续执行UPdate-Database
在这里插入图片描述
在这里插入图片描述

6.查看数据库
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

EFCORE 增删改查

插入数据

1、只要操作Books属性,就可以向数据库中增加数据,但是通过C#代码修改Books中的数据只是修改了内存中的数据对Books做修改后,需要调用DbContext的异步方法SaveChangesAsync0把修改保存到数据库。也有同步的保存方法SaveChanges0,但是用EF Core都推荐用异步方法
2、EF Core默认会跟踪(Track)实体类对象以及DbSet的改变。
3、演示数据插入

1.在Main函数中
在这里插入图片描述
2.由于myDbContext 继承自DbContext ,
在这里插入图片描述
DbContext实现了 IDisposable
在这里插入图片描述
3.所以需要 使用 using 防止资源泄漏
在这里插入图片描述

4.执行

在这里插入图片描述

数据插入成功

6.多表插入
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述

查询数据

1、DbSet实现了IEnumerable接口,因此可以对DbSet实施Linq操作来进行数据查询。EF Core会把Linq操作转换为SOL语句。面向对象,而不是面向数据库(SQL)
2、ctx.Books.Where(b => b.Price > 80) Book bl = ctx.Books.Single(b => b.Title==“零基础趣学C语言”);
Book b2 = ctx.Books.FirstOrDefault(b=>b.Id==9);
3、可以使用OrderBy操作进行数据的排序IEnumerable books =ctx.Books.OrderByDescending(b => b.Price)

演示:
插入初始化数据
在这里插入图片描述
数据插入成功
在这里插入图片描述
能使用Linq 查询得原因
在这里插入图片描述
实现了IEnemerable 接口
在这里插入图片描述

查询测试:
在这里插入图片描述

运行结果:

在这里插入图片描述

测试二
在这里插入图片描述
运行结果;
在这里插入图片描述

测试三:排序

在这里插入图片描述
测试结果:
在这里插入图片描述
去除 10 一下的

在这里插入图片描述
【查询】不需要SaveChangesAsync

运行结果:

在这里插入图片描述

查询数据2

1、GroupBy也可以

var groups = ctx.Books.GroupBy(b => b.AuthorName)
.Select(g => new { AuthorName = g.Key,
BooksCount = g.Count(), 
MaxPrice = g.Max(b =>b.Price));
foreach(var g in groups){Console.WriteLine($"作者名:{g.AuthorName},著作数量:{g.BooksCount},最贵的价格:g.MaxPrice}");
}

2、大部分Linq操作都能作用于EF Core

示例:
在这里插入图片描述
运行结果:
在这里插入图片描述

修改、删除

1、要对数据进行修改,首先需要把要修改的数据查询出来,然后再对查询出来的对象进行修改,然后再执行SaveChangesAsync0保存修改。
var b = ctx.Books.Single(b=>b.Title==“数学之美”);
b.AuthorName = “Jun Wu”;
await ctx.SaveChangesAsync));
2、删除也是先把要修改的数据查询出来,然后再调用DbSet或者DbContext的Remove方法把对象删除,然后再执行SaveChangesAsync0保存修改。
var b = ctx.Books.Single(b => b.Title ==“数学之美”);
ctx.Remove(b);
//也可以写成
ctx.Books.Remove(b);
await ctx.SaveChangesAsync();

示例:
在这里插入图片描述
运行结果:
在这里插入图片描述
在这里插入图片描述

批量修改、删除

1、目前批量修改、删除多条数据的方法
局限性:性能低:查出来,再一条条Update、Delete,而不能执行Update … where; delete … where;
2、官方目前还没有支持高效的批量Update、Delete,有在后续版本中增加但是目前只是前期意见征询阶段。
3、我实现了一个开源的高效批量修改、删除的开源项目Zack.EFCore.Batch
https://github.com/yangzhongke/Zack.EFCore.Batch

await ctx.DeleteRangeAsync(b => b.Price > n b.AuthorName == “zack yang”);

await ctx.BatchUpdate()
.Set(b => b.Price,b => b.Price + 3)
.Set(b => b.Title,b => s)
.Set(b => b.AuthorName, b=>b.Title.Substring(3,2)+b,AuthorName.ToUpper())
.Set(b > b.PubTime,b => DateTime.Now)
.where(b => b.Id > n ll b.AuthorName.startswith(“Zack”))
.ExecuteAsync0);

示例:
把所有价格大于10的书 都上涨1元
在这里插入图片描述
运行结果:
在这里插入图片描述
通过 SQL SEVER Profiler 查看当前数据库接受的所有sql 语句
在这里插入图片描述
在这里插入图片描述
执行了多次 update 语句
对于数量很大的功能实现,性能很差

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620747.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mac上部署单体hbase

1. 简介 HBase 是一个开源的、分布式的、版本化的典型非关系型数据库。它是 Google BigTable 的开源实现&#xff0c;并且是 Apache 基金会的 Hadoop 项目的一部分1。HBase 在 Hadoop Distributed File System (HDFS) 上运行&#xff0c;作为一个列式存储非关系数据库管理系统…

yolov8在进行目标追踪时,model.track()中persist参数的含义

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Unity 面试篇|(五)热更新与Lua语言篇 【全面总结 | 持续更新】

目录 1.什么是热更新&#xff1f;2.主流的代码热更方案有哪些&#xff1f;3.AssetBundle介绍4.AssetBundle的具体开发流程5.AssetBundle的压缩格式6.AssetBundle对象的加载方式7.ssetBundle资源卸载8.资源如何打包&#xff1f;依赖项列表如何生成&#xff1f;9.如何解析版本文件…

华为OD机试2024年最新题库(Python)

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年1月-5月&#xff0c;考的都是OD统一考试&#xff08;C卷&#xff09;&#xff0c;题库已经整理…

Flutter之运行错误:this and base files have different roots

运行时报错&#xff1a; this and base files have different roots: E:\Demolpro\waqu\build\flutter-plugin-_android_lifecycle and C:\Users\78535\AppData\Local\Pub\Cache\hosted\pub.dev\flutter_pulgin_android_lifecycle-2.0.17\android 如图&#xff1a; 这种情况…

【JavaSE】P33~P113 方法,重载,数组,对象,构造器,this关键字,数组和对象的内存图,JavaBean

练习 1 方法方法定义及调用JShell简单使用&#xff08;要求Java9以上&#xff09;方法语句流程控制及注意事项选择循环 方法的重载 2 数组三种初始化方式数组在内存中的存储内存图 3 对象对象内存图Getter/Setter快捷写法this 关键字构造方法JavaBean的四个标准对象数组 二、编…

微信小程序支付之V2支付

一、引入maven <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.3.4.B</version><exclusions><exclusion><artifactId>qrcode-utils</artifactId&…

生成视频 图像拖拽生成视频

目录 motionctrl DragNUWA 预训练模型&#xff1a; motionctrl 该工具的多功能性使其成为视频制作领域的一项重要创新。它不仅能与现有的视频生成工具如LVDM和VideoCrafter1无缝集成&#xff0c;还能与SVD等其他视频生成方法兼容&#xff0c;为视频创造提供更多可能性。此外…

带F/V变换的反馈型相位控制电路D211,内置过载限制功能、电压监测功能

D211是一块相位控制集成电路&#xff0c;该电路内部具有F-V转换接口、控制放大器、过载限制、软启动、自动重触发、电压监视、电压电流同步等功能。主要应用于电动工具中马达转速的控制。 主要特点&#xff1a; 内置F-V转换接口 外控制集成放大器 内置过载限制功能 …

【数据结构】八大排序之计数排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.计数排序简介及思想 二.计数排序代码实现 三.计数排序复杂度分析 &#x1f4cc;时间复杂度 &#x1f4cc;空间复杂度 结语 一.计数排序简介及思想 计数排序(Cou…

Gitlab集成openLDAP统一认证登录

vim /etc/gitlab/gitlab.rb&#xff0c; 可以配置很多个server&#xff0c;因此与sssd服务一样可以配置多个ldap作为高可用 gitlab-ctl reconfiguregitlab-rake gitlab:ldap:checkgitlab-ctl restart gitlab-rake gitlab:ldap:check Checking LDAP ...LDAP: ... Server: ldapm…

Leetcode刷题(二十四)

括号生成&#xff08;Medium&#xff09; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。示例 1&#xff1a;输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()&…

发起人自选-钉钉审批

场景描述 配置一个审批流程&#xff0c;在某些审批节点&#xff0c;不能确定谁具体来审批&#xff0c;所以需要手工选择一个人或者多个人保证流程能得以顺利通过。有些审批流程的做法是&#xff0c;上一个节点来选择指定的人&#xff0c;而钉钉的做法是发起人来指定。 钉钉设…

【Maven】007-Maven 工程的继承和聚合关系

【Maven】007-Maven 工程的继承和聚合关系 文章目录 【Maven】007-Maven 工程的继承和聚合关系一、Maven 工程的继承关系1、继承的概念2、继承的作用3、继承的语法4、父工程统一管理依赖版本父工程声明依赖版本子工程继承以来版本 二、Maven 工程的聚合关系1、聚合的概念2、聚合…

linux文本三剑客(grep,sed,awk)使用

目录 一、grepgrep概念grep使用 二、sedsed概念sed使用 三、awkawk概念awk使用 一、grep grep概念 Linux系统中grep命令是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expressi…

【信号与系统】【北京航空航天大学】实验一、信号的MATLAB表示及信号运算

一、实验目的 1、初步掌握 MATLAB 仿真软件的使用&#xff1b; 2、学习使用 MATLAB 产生基本时域信号&#xff0c;并绘制信号波形&#xff1b; 3、学习利用 MATLAB 实现信号的基本运算&#xff1b; 4、利用 MATLAB 分析常用的连续时域信号。 二、实验内容 1、 生成连续信号 …

Redis 常见的性能问题有哪些?该如何解决?

Redis 常见的性能问题有哪些&#xff1f;该如何解决&#xff1f; Redis 常见的性能问题包括内存使用过高、网络延迟、阻塞操作、持久化操作引起的性能问题等。以下是一些常见性能问题及解决方法&#xff1a; 内存使用过高&#xff1a; 问题&#xff1a; 当 Redis 使用的内存超…

jQuery圆形轮播自动切换图文

jQuery圆形轮播自动切换图文 注意这里用到了swiper插件&#xff0c;记得引入swiper.js和swiper.css swiper官网 这里面用到的swiper版本是Swiper 4.4.2 不同版本有些写法会不同&#xff0c;可对照官方文档进行调整 效果展示 jquery圆形轮播自动切换文字 html代码片段 <li…

【LangChain学习之旅】—(6) 提示工程(下):用思维链和思维树提升模型思考质量

【LangChain学习之旅】—&#xff08;6&#xff09; 提示工程&#xff08;下&#xff09;&#xff1a;用思维链和思维树提升模型思考质量 什么是 Chain of ThoughtFew-Shot CoTZero-Shot CoTChain of Thought 实战CoT 的模板设计程序的完整框架Tree of Thought总结 Reference&a…

优雅草蜻蜓API大数据服务中心v1.0.4更新-加入蓝奏云直链解析·每日Bing·字数统计·今日油价·历史上的今天等接口

2024年1月13日优雅草蜻蜓API大数据服务中心v1.0.4更新-加入蓝奏云直链解析每日Bing字数统计今日油价历史上的今天等接口 优雅草api服务-大数据中心自12月29日推出以来截止2024年1月13日累计被调用次数为413次&#xff0c;共收录23个接口&#xff0c;截止前一日2024年1月12日当…