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

news2025/2/26 15:04:19

一 、什么是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.coloradmin.cn/o/1382947.html

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

相关文章

自动粘贴文本:高效复制中国邮政编码,提升效率,释放创意

在快节奏的现代生活中&#xff0c;时间就是金钱&#xff0c;效率就是生命。中国邮政EMS&#xff0c;作为您的快递服务首选&#xff0c;一直致力于提供更加便捷、高效的寄递体验。今天&#xff0c;我们隆重推出全新功能——"自动粘贴文本"&#xff0c;让您轻松复制邮政…

test-02-test case generate 测试用例生成 EvoSuite 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 什么…

Centos7 安装与卸载mysql

卸载 ps ajx | grep mysql &#xff1a; 查看当前服务器是否有mysql 没有的话就不需要卸载咯。 centos7 通过yum下载安装包通常是以.rpm为后缀&#xff0c;rpm -qa 可以查看当前服务器上所有的安装包&#xff1a; rpm -qa | grep mysql | xargs yum -y remove :将查询到的mysql…

第三十九周:文献阅读+Transformer

目录 摘要 Abstract 文献阅读&#xff1a;CNN与LSTM在水质预测中的应用 现有问题 提出方法 相关模型 CNN LSTM CNN-LSTM神经网络模型 模型框架 CNN-LSTM神经网络 研究实验 数据集 模型评估指标 数据预处理 实验设计与结果 研究贡献 Transformer Encoder-Dec…

ES6(ECMAScript 6.0)

ES6 学习链接ES6什么是ES6&#xff1f;ECMAScript 和 JavaScript 的关系 ECMAScript各版本新增特性ES6 块级作用域 let 学习链接 ES6简介 ECMAScript简介及特性&#xff08;科普&#xff01;很详细&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 20分钟上手ES…

Java多线程并发篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、Semaphore 信号量二、Semaphore 与 ReentrantLock 区别三、可重入锁(递归锁)四、公平锁与非公平锁前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,…

【促销定价】背后的算法技术 2 - 数据预处理生成

【促销定价】背后的算法技术 2 - 数据预处理生成 01 数据探查02 数据清洗03 数据聚合04 数据补全05 小结参考文献 导读&#xff1a;在日常生活中&#xff0c;我们经常会遇见线上/线下商家推出各类打折、满减、赠品、新人价、优惠券、捆绑销售等促销活动。一次成功的促销对于消费…

什么类型的企业需要工单系统?适用场景与优势分析

在现代商业中&#xff0c;必须高效地管理与跟踪大量任务和工作流程。对一些企业而言&#xff0c;处理很多订单是一项具有挑战性的任务。此订单可能来自客户需求、内部问题反馈或各种业务流程中的任务分配。可是&#xff0c;如果没有好的解决方法&#xff0c;这类订单可能会致使…

用LM Studio:2分钟在本地免费部署大语言模型,替代ChatGPT

你想在本地使用类似ChatGPT 的大语言模型么&#xff1f;LM Studio 可以帮你2分钟实现ChatGPT的功能&#xff0c;而且可以切换很多不同类型的大语言模型&#xff0c;同时支持在Windows和MAC上的PC端部署。 LM Studio是一款面向开发者的友好工具&#xff0c;特别适合那些想要探索…

Costco攻入山姆大本营

01 Costco深圳店开业火爆 “我今天不去Costco&#xff0c;早上还没开业&#xff0c;路上就已经堵车了&#xff0c;看来今天人很多&#xff0c;过几天再去”&#xff0c;原本计划在Costco开业当天去逛逛的张芸&#xff08;化名&#xff09;无奈只能放弃。 家住在Costco深圳店旁…

vue2+elementui的el-table固定列会遮住横向滚动条以及错位

解决方案 我是最右侧固定列&#xff0c;所以下面的class名称是.el-table__fixed-right, 如果有左侧固定请自行替换为el-table__fixed 防止固定列表格高度错位 .el-table__fixed-body-wrapper {.el-table__body {padding-bottom: 15px; // 这个得自己调试看多少合适}} }如果还…

C#,史密斯数(Smith Number)的计算方法与源代码

一、关于史密斯数的传说 1、关于理海大学Lehigh University 理海大学&#xff08;Lehigh University&#xff09;&#xff0c;位于宾夕法尼亚州&#xff08;Pennsylvania&#xff09;伯利恒&#xff08;Bethlehem&#xff09;&#xff0c;由富有爱国情怀与民族精神的实业家艾萨…

Java基础之虚拟机

1、前言 本篇基于网络整理&#xff0c;和自己编辑。在不断的完善补充哦。 2、什么是虚拟机&#xff1f; Java 虚拟机&#xff0c;是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件( .class )。 Java 被设计成允许应用程序可以运…

Required request parameter ‘ids‘ for method parameter type List is not present]

在写delete方法的时候&#xff0c;出现了bug 于是将RequestParam换成PathVariable 两者有何区别&#xff1f; pathVariable和RequestParam的区别 在Spring MVC框架中&#xff0c;PathVariable 和 RequestParam 是两种用于从HTTP请求中获取参数的注解&#xff0c;它们的区别…

企业网盘助力数字化教育资源库建设

教育行业数字化是适应社会发展的必然选择&#xff0c;是教育行业的未来重要发展趋势。万事开头难&#xff0c;如何在数字化时代升级转型是教育行业团队正在面临的挑战。Zoho Workdrive企业网盘深耕智慧文件管理服务&#xff0c;为教育行业量身打造集中文件管理库&#xff0c;推…

test-04-test case generate 测试用例生成 tcases A model-based test case generator

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 自动生成测试用例 Tcases&#xf…

Elasticsearch 地理空间搜索 - 远超 OpenSearch

作者&#xff1a;来自 Elastic Nathan_Reese 2021 年&#xff0c;OpenSearch 和 OpenSearch Dashboards 开始作为 Elasticsearch 和 Kibana 的分支。 尽管 OpenSearch 和 OpenSearch Dashboards 具有相似的血统&#xff0c;但它们不提供相同的功能。 在分叉时&#xff0c;只能克…

决策树:理解机器学习中的关键算法

决策树&#xff1a;理解机器学习中的关键算法 决策树是一种流行而强大的机器学习算法&#xff0c;它从数据中学习并模拟决策过程&#xff0c;以便对新的未知数据做出预测。由于其直观性和易理解性&#xff0c;决策树成为了分类和回归任务中的首选算法之一。在本文中&#xff0…

JVM实战(14)——Young GC调优

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…