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

这篇具有很好参考价值的文章主要介绍了杨中科 .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 类
    杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
    杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

  2. 安装程序包
    杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

开发环境搭建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
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

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

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

开发环境搭建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等命令会如下报错
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

开发环境搭建4-Migration

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

1.杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
此时项目中多出一个Migrations文件
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

打开文件查看

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

此时刷新数据库 发现表已经创建完成
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

开发环境搭建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属性
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
2.执行Add-Migration + name
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

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

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
查看文件内容
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

3.验证Update-Database 是编译代码之后在执行,故意添加一行错误代码在执行
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

运行结果:

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

去掉错误代码,在执行

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

运行成功 ,查看数据库表

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

添加成功。

修改表字段属性

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
发现此时该字段,允许为空,且长度限制为最大程度(因为实体类中为String,String 是可以为空得,长度也不知道为多少)。是不合理得设计。

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

1.在Person中添加新列
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

2.修改BookConfig文件
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

3.新增dog类
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
为了和Dbcontext产生关系,必须加入到 MyDbContext配置类中,才能和数据库产生关系
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

4.执行
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
【警告】
可能会产生数据丢失(原本长度为不限制,现在改为不限制,)

5.继续执行UPdate-Database
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

6.查看数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

EFCORE 增删改查

插入数据

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

1.在Main函数中
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
2.由于myDbContext 继承自DbContext ,
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
DbContext实现了 IDisposable
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
3.所以需要 使用 using 防止资源泄漏
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

4.执行

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

数据插入成功

6.多表插入
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
运行结果:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

查询数据

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)

演示:
插入初始化数据
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
数据插入成功
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
能使用Linq 查询得原因
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
实现了IEnemerable 接口
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

查询测试:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

运行结果:

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

测试二
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
运行结果;
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

测试三:排序

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
测试结果:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
去除 10 一下的

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
【查询】不需要SaveChangesAsync

运行结果:

杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

查询数据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

示例:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
运行结果:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

修改、删除

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();

示例:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
运行结果:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库

批量修改、删除

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元
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
运行结果:
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
通过 SQL SEVER Profiler 查看当前数据库接受的所有sql 语句
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
杨中科 .NETCORE EFCORE 第一部分 基本使用,.netcore,数据库
执行了多次 update 语句
对于数量很大的功能实现,性能很差文章来源地址https://www.toymoban.com/news/detail-797942.html

到了这里,关于杨中科 .NETCORE EFCORE 第一部分 基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用esp32+micropython+microdot搭建web(http+websocket)服务器(超详细)第一部分

    microdot文档速查 什么是Microdot?Microdot是一个可以在micropython中搭建物联网web服务器的框架 micropyton文档api速查 Quick reference for the ESP32 演示视频链接 视频中我们简单的实现了 使用esp32搭建web服务器 实现get请求 上传网页到服务器 手机打开网址访问该网页 服务器处理请求,实现开

    2024年02月08日
    浏览(51)
  • 模拟第一部分5

    1、如果想要在外部包中使用全局变量,则全局变量必须( ) 正确答案:A A、首字母必须大写 B、首字母必须小写 C、必须加上const D、必须加上var 答案解析:在函数体外声明的变量称之为全局变量。全局变量声明必须以 var 开头,如果想要在外部包中使用

    2024年02月08日
    浏览(45)
  • 第一部分:核心容器

    Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!         什么是IoC、IoC容器、bean、DI ? IoC:对象创建控制权由程序转移到IoC容器的控制反转思想。 IoC容器:创建管理对象的容器。 bean:IoC容器中被创建管理的对象。 DI:IoC容器中建立bean之间依赖关

    2024年02月13日
    浏览(44)
  • 6.播放音频(第一部分)

    这一章将对播放音频的具体内容做讲解。我的想法是按照tinyalsa中的例子作为讲解的范本,因为tinyalsa足够简单,很多时候都忽略了它的细节。趁着这个机会再整理一下tinyalsa的内容。我使用的tinyalsa从https://github.com/tinyalsa/tinyalsa下载,从examples/writei.c开始。 其中函数read_file从

    2023年04月08日
    浏览(37)
  • MySQL学习-第一部分

    MySQL数据库 MySQL是一个**关系型数据库管理系统****,**由瑞典[MySQL AB](https://baike.baidu.com/item/MySQL AB/2620844) 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用

    2024年02月15日
    浏览(50)
  • 第一部分:Spark基础篇

    第一部分:Spark基础篇_奔跑者-辉的博客-CSDN博客 第二部分:Spark进阶篇_奔跑者-辉的博客-CSDN博客 第三部分:Spark调优篇_奔跑者-辉的博客-CSDN博客 第一部分:Flink基础篇_奔跑者-辉的博客-CSDN博客 (*建议收藏*) 实时数仓之 Kappa 架构与 Lambda 架构_奔跑者-辉的博客-CSDN博客(*建议收

    2024年02月05日
    浏览(47)
  • 第一部分-基础篇-第一章:PSTN与VOIP(下篇)

      学习资料来源《FreeSWITCH权威指南》-作者杜金房这本书。我是2022年6月毕业的,偶然的机会接触到FreeSWITCH,但是目前在南京从事java后端开发,FreeSWITCH纯属个人爱好,进行笔记整理。也一直希望有机会可以参与FreeSWITCH相关工作开发,如有需要,请联系我18956043585,先说声谢

    2024年02月06日
    浏览(53)
  • HTML学习 第一部分(前端学习)

    参考学习网站: 网页简介 (w3schools.com) 我的学习思路是:网站+实践+视频。 视频很重要的,因为它会给你一种开阔思路的方式。你会想,噢!原来还可以这样。这是书本或者网站教程 所不能教给你的。而且,对一些教程,它的用法你可能 在工作或者以后都用不上,这种情况下

    2024年02月15日
    浏览(48)
  • Mysql入门基础教程(第一部分)

    MySQL基础教程解释了一些基本的SQL语句。如果这是您第一次使用关系数据库管理系统,本教程将为您提供使用MySQL数据库服务器所需的一切,例如查询数据,更新数据,管理数据库和创建表。 如果您已经熟悉其他关系数据库管理系统(如PostgreSQL,Oracle或Microsoft SQL Server等),

    2024年04月14日
    浏览(37)
  • 字符串---第一部分 序列、字串;上升,公共

    第一部分 最长上升子序列,最长上升子串,最长公共子序列,最长公共子串--dp 第二部分 KMP,trie,双指针 第三部分 待定 动态规划:审题,状态确定,状态转移,边界条件 线性DP 最长上升子序列 403 线性DP 最长上升子序列【动态规划】_哔哩哔哩_bilibili 给定一个无序整数数组

    2024年02月07日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包