目录

1. EF Core简介

2. Demo运行环境

3. 创建Prism项目 & 类库

4. EF Core -- DBFirst

5. EF Core -- CodeFirst

6. EF Core -- 增删改查

6.1 查询

6.2 插入

6.3 更新

6.4 删除

7. EF Core -- 批量更新

7.1 使用EFCore.BulkExtensions操作Postgresql

7.1.1 Bulk相关(一条操作一个事务,均是传入实体)

7.1.2 Batch相关(按条件)

7.1.3 事务

7.2 使用 Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作Mysql

8. 其他

8.1  VS2022安装PrismTemplatePack

8.2  使用Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作mysql时报错

8.3  插入数据报错

8.4  使用 await dbFContext.BulkReadAsync(students),查询不到数据?

9. github地址

10. 参考


1. EF Core简介

Entity Framework (EF) Core 是轻量化、可扩展、开源和跨平台版的常用 Entity Framework 数据访问技术。

EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:

  • 使 .NET 开发人员能够使用 .NET 对象处理数据库。
  • 无需再像通常那样编写大部分数据访问代码。

EF Core 支持多个数据库引擎,请参阅数据库提供程序了解详细信息。

Code First :先编写 C# 实体类,EF Core 会根据实体类之间的关系创建数据库;

Database First :先设计和创建数据库,EF Core 根据数据库的表结构生成 C# 实体类。

2. Demo运行环境

IDE -- VS2022

框架 --  .Net 6.0

数据访问 --  EF Core 6.0.1

UI -- WPF --Prism框架

数据库 -- Mysql、Postgresql

3. 创建Prism项目 & 类库

创建Prism项目,修改目标框架为.Net 6.0

再创建两个类库,分别对应DBFirst/CodeFirst,为EFCore_Test添加这两个项目引用

4. EF Core -- DBFirst

使用NuGet安装下图几个包

DBFirst采用Postgresql。使用pgAdmin 4创建数据库EFCoreDB,三个表student、course、

choose_course

根据已有数据库生成实体:

将EFCore_DBFirst该项目设置为启动项目,进入程序包控制台,如图:

输入如下指令,Scaffold-DbContext指令详情

Scaffold-DbContext -Connection "Server=127.0.0.1;Port=5432;Database=EFCoreDB;User Id=postgres;Password=1;" -Provider Npgsql.EntityFrameworkCore.PostgreSQL -Context DBFContext

运行成功后,生成如下实体类

context中配置数据库连接时,使用明文产生此警告,可改为使用配置文档

添加配置文档appsettings.json

{"ConnectionStrings": {"NpgsqlDbConn_DBFirst": "Server=127.0.0.1;Port=5432;Database=EFCoreDB;User Id=postgres;Password=1;","MysqlDbConn_CodeFirst": "Server=127.0.0.1;Port=3306;Database=EFCoreCode;User Id=root;Password=hirosedb;"}
}

调用

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){IConfiguration config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();string ConnectStr = config.GetConnectionString("NpgsqlDbConn_DBFirst");optionsBuilder.UseNpgsql(ConnectStr);}}

5. EF Core -- CodeFirst

CodeFirst使用Mysql,Nuget安装如下包

新建实体类:Book、Comment,使用特性实体与数据库对应

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;namespace EFCore_CodeFirst
{[Table("Book")]   //表名public class Book{[Key]    //主键[Column("Id")]  //列名[DatabaseGenerated(DatabaseGeneratedOption.Identity)]  //主键自增public int Id { get; set; }[Column("Title")]public string? Title { get; set; }[Column("Price")]public double? Price { get; set; }[Column("PubTime")]public DateTime? PubTime { get; set; }=DateTime.Now;[Column("AuthorName")]public string? AuthorName { get; set; }}
}
[Table("Comment")]public class Comment{[Key][Column("Id")][DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int Id { get; set; }[Column("Title")]public string? Title { get; set; }[Column("CreatedDate")]public DateTime CreatedDate { get; set; }=DateTime.Now;[Column("CommentStr")]public string? CommentStr { get; set; }}

创建context类,继承DbContext

using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;namespace EFCore_CodeFirst
{public class CodeFContext : DbContext{//定义实体  EFcore默认追踪public DbSet<Book> Books { get; set; } = null!;public DbSet<Comment> Comments { get; set; } = null!;private string ConnectStr=null!;protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){IConfiguration config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json").Build();ConnectStr = config.GetConnectionString("MysqlDbConn_CodeFirst");optionsBuilder.UseMySql(ConnectStr, ServerVersion.AutoDetect(ConnectStr));}}protected override void OnModelCreating(ModelBuilder modelBuilder){base.OnModelCreating(modelBuilder);}}
}

由实体生成数据库,将EFCore_CodeFirst设为启动项目,调用指令add-migration "变量";

会生成如下文件

调用指令Update-Database ,更新数据库

使用Navicat查看数据库,生成成功

6. EF Core -- 增删改查

先new一个context实例,通过绑定跟踪的DbSet实体,实现数据操作

private CodeFContext codeFContext= new CodeFContext();

6.1 查询

private List<Book> _books;public List<Book> Books{get => _books; set => SetProperty  (ref _books, value);}
//查询Book表所有数据
Books = codeFContext.Books.ToList();
//条件查询,linq操作
Books = codeFContext.Books.Where(x => x.Id > 3).ToList();

6.2 插入

private async void InsertData(){var books=new List<Book>() { new Book() { Title ="追风筝的人"},new Book() { Title ="霍乱时期的爱情"}};//修改DbSetcodeFContext.Books.AddRange(books);//再save更改await codeFContext.SaveChangesAsync();}

6.3 更新

private async void UpdateData(){//需要先查询var books = codeFContext.Books.Where(x => x.Title == "追风筝的人");//再对查询到的数据进行修改foreach (var item in books){item.Title = "放学后";}//再save更改await codeFContext.SaveChangesAsync();}

6.4 删除

private async void DeleteData(){//先Linq查询var books= codeFContext.Books.Where(x => x.Id>5);//从实体中删除数据codeFContext.Books.RemoveRange(books);//再save更改await codeFContext.SaveChangesAsync();}

7. EF Core -- 批量更新

EF 目前不提供用于执行批量更新的 API.

7.1 使用EFCore.BulkExtensions操作Postgresql

7.1.1 Bulk相关(一条操作一个事务,均是传入实体)

//查询
List<Student> students =new List<Student>();await dbFContext.BulkReadAsync(students);
//插入
var students = new List<Student>(){new Student() {Id=1, Name = "AA" ,StuNum="2010"},new Student() {Id=2, Name = "BB" ,StuNum="2011"},new Student() {Id=3, Name = "CC",StuNum="2012" }};await dbFContext.BulkInsertAsync(students);
//删除
var stus = dbFContext.Students;await dbFContext.BulkDeleteAsync(stus.ToList());
//更新
var stus = dbFContext.Students.ToList();foreach (var item in stus){item.Name += "QQQ";}await dbFContext.BulkUpdateAsync(stus);

7.1.2 Batch相关(按条件)

//删除
await dbFContext.Students.Where(x=>x.Name=="BB").BatchDeleteAsync();
//更新(改成新数据)
await dbFContext.Students.Where(x => x.StuNum == "2222").BatchUpdateAsync(new Student() {StuNum="2233" });
//更新(基于原数据)
await dbFContext.Students.Where(x => x.StuNum == "2233").BatchUpdateAsync(x=>new Student() { StuNum =x.StuNum+ "444" });

7.1.3 事务

//Bulk相关(一条操作一个事务,均是传入实体)//直接使用这些操作时,每个操作都是独立的事务,并且会自动提交。//如果我们需要在单个过程中执行多个操作,则应使用显式事务public async void TransactionTest(){using (var transaction= dbFContext.Database.BeginTransaction()){try{var students = new List<Student>(){new Student() {Id=6, Name = "DD" ,StuNum="2044"},new Student() {Id=7, Name = "EE" ,StuNum="2055"}};await dbFContext.BulkInsertAsync(students);await dbFContext.Students.Where(x => x.StuNum == "2044").BatchUpdateAsync(new Student() { Name = "DDEEF" });transaction.Commit();}catch (Exception ex ){//using包裹不需要手写rollback,报错会自动回滚Console.WriteLine(ex.Message);}}}

7.2 使用 Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作Mysql

//添加配置
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){if (!optionsBuilder.IsConfigured){optionsBuilder.UseBatchEF_MySQLPomelo();}}//批量删除,
await codeFContext.DeleteRangeAsync<Book>(x=>x.Id>5);
//批量更新,条件,设置更新的列和值,执行await codeFContext.BatchUpdate<Book>().Where(x => x.Title == "放学后").Set(x=>x.Title,x=>x.Title+"Test").Set(x=>x.Price,x=>20).ExecuteAsync();
//批量删除和批量更新都支持通过Take()、Skip()来实现部分删除和部分更新
// Take(3) 代表选取3个 ,如果满足条件的不足3个 那就有几个选几个 可以一个都没有,超过的话只选顺序前 3 个
await codeFContext.Books.Where(x=>x.Id>5).Take(3).DeleteRangeAsync(codeFContext);
//Skip(3) 代表跳过3个 ,如果满足条件的不足3个 那就有几个选几个 跳过几个,超过的话只跳过顺序的前 3 个
await codeFContext.BatchUpdate<Book>().Where(x => x.Title == "放学后").Set(x => x.Title, x => x.Title + "Test").Set(x => x.Price, x => 20).Skip(3).ExecuteAsync();
//批量插入
var books=new List<Book>() { new Book() { Title ="追风筝的人"},new Book() { Title ="霍乱时期的爱情"}};await codeFContext.BulkInsertAsync(books);

8. 其他

8.1  VS2022安装PrismTemplatePack

VS2022扩展中搜不到Prism模板,安装包在github中有。

8.2  使用Zack.EFCore.Batch.MySQL.Pomelo_NET6 操作mysql时报错

插入数据   await codeFContext.BulkInsertAsync(books),报如下错误

解决:在json配置文件中的,连接字符串添加AllowLoadLocalInfile=true

8.3  插入数据报错

解决:查看全局系统变量 'local_infile' 的值,将其set为on,如下图。自此,插入语句可正常执行

8.4 使用 await dbFContext.BulkReadAsync(students),查询不到数据?

求解

9. github地址

KilterW/EFCore_Test: Basic use of EFCore (github.com)

10. 参考

入门 - EF Core | Microsoft Docs

EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性 - 知乎 (zhihu.com)

EFcore使用EFCore.BulkExtensions 批量增加、删除、修改 – MENG (nipoo.net)

.Net -- EF Core详解相关推荐

  1. 【Linux】ps -ef|grep详解

    [Linux]ps -ef|grep详解 Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux.这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种 ...

  2. ps -ef 命令详解

    ps -ef 命令详解 转自:http://blog.csdn.net/lg632/article/details/52556139 ps [选项] 下面对命令选项进行说明: -e   显示所有进程. ...

  3. linux下ps ef命令详解,linux命令中ps -ef详解

    1.ps -ef表示bai查看全格式的全部进程. ps是linux下最常用的也是非常强大的进程查看命令,常配合管道命令 | 和查找命令 grep 同时执行来查看特定进程. 参数含义: -e 显示所有进 ...

  4. Linux中 ps -ef 指令详解

    一.基础概念 指令: ps 作用: 主要是查看服务器的进程信息 选项含义: -e:等价于 '-A' ,表示列出全部的进程 -f:显示全部的列(显示全字段) 二.执行结果 列的含义说明: UID: 该进 ...

  5. Linux中ps -ef 命令详解

    ps -ef的意思是以长格式显示所有进程:"|"是管道,意思是前面ps的输出做为后面的输入,即-grep命令所检索的文本源:grep tomcat是在所有进程里查找与字符tomca ...

  6. 31.进程管理之进程概览,及ps命令详解,ps -ef,ps aux,ps -le,ps -l输出详解和示例

    本小章讲解进程管理中的进程概览和作用,及ps命令详解,ps -ef,ps aux,ps -le,ps -l的输出详解和示例 文章目录 进程概览 什么是进程和程序 进程管理的作用 进程启动方式 僵尸进程 ...

  7. 【125】Linux 中 ps -ef|grep和ps、grep详解

    一.ps -ef|grep详解(原文见公众号python宝)         ps命令将某个进程显示出来,PS是LINUX下最常用的也是非常强大的进程查看命令         grep命令是查找,是一 ...

  8. Docker基础03--Dockerfile详解与镜像发布--(狂神说docker学习笔记)

    文章目录 1. Dockerfile介绍 2. Dockerfile指令说明 3. 制作Centos镜像 3.1 编写Dockerfile的文件 3.2 通过这个文件构建镜像(注意最后加个点!!!) ...

  9. 详解OS X和iOS图像处理框架Core Image

     详解OS X和iOS图像处理框架Core Image width="22" height="16" src="http://hits.sinaj ...

  10. asp.net core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

最新文章

  1. python cnn代码详解图解_TextCNN 代码详解(附测试数据集以及GitHub 地址)
  2. 使用 Amazon Cloud WAN 构建您的全球网络
  3. C++数据结构之链式结构
  4. 软件本地化 pdf_软件本地化与标准翻译
  5. ie11不识别html5影片,IE11无法显示flash?IE11无法播放视频的解决方法
  6. 大学生计算机社团该办什么活动,大学生社团活动策划方案
  7. 聪明的ET,更多的是阿里的人工智能布局
  8. php array_diff 用法
  9. 工业相机镜头选型教程
  10. ubuntu下deactivate matlab的操作
  11. 【转载】宜州市德胜镇
  12. Oracle实现递归查询
  13. 浏览器放大缩小,页面布局不变,浏览器放大百分比,页面放大到左上角,浏览器缩小百分比,页面缩小至中间(类似csdn官网效果)
  14. Ae 入门系列之五:效果和预设
  15. ui设计属于什么专业?ui设计的前景怎么样?
  16. AWS Academy 学习平台建立 Learner Lab - 教师
  17. 云开发系列课程 | FaaS场景下的SSR框架
  18. 【人事】如何克服面试紧张
  19. BUUCTF:[SWPUCTF 2016]Web blogsys
  20. Linux智能家居系统(家用IOT技术)-立哥经验

热门文章

  1. 春天不远:熬过寒冬,步入冰川时代,静待下一个新纪元!
  2. docx文档怎么排列图片_怎么把图片文字转换成word文档
  3. <<计算机视觉CVPR>>2022:Grounded Language-Image Pre-training
  4. FPGA零基础学习:VGA协议驱动设计
  5. redis----------基本命令使用
  6. 麦子学院字符设备驱动201126
  7. 【YOLOv5-6.x】设置可学习权重结合BiFPN(Add操作)
  8. typecho添加html5视频播放器,Typecho音乐播放器插件AudioPlayer1.2.6更新
  9. [LintCode]144. 交错正负数(献给卡在65%的你)
  10. Ubuntu18.04grub增加console口输出