一、EF Core执行非查询原生sql语句

为什么要写原生sql语句

执行非查询sql语句

内插值语法:$"我是{name},我的年龄是{age}"

多行@

ctx.Database.ExecateSqlInterpolatedAsync($"inster into...")

有sql注入漏洞吗? 没有                sql注入最好的解决方案是参数化sql处理

1、字符串内插值的方式不会有sql注入攻击漏洞;

2、字符串内插如果赋值给string变量,就是字符串拼接;字符串内插值如果赋值给FormattableString类型变量,编译器就会构造FormattableString对象,属性Formar和GetArguments()方法

3、ExecuteSqlInterPolatedAsync()的参数FormattableString类型,因此ExecutSqlInterPolatedAsync会进行参数化sql处理

4、除了ExecuteSqlInterPolated(),ExecuteSqlInterPolatedAsync()还有ExecuteSqlRaw(),ExecuSqlRawAsync()也可以执行原生sql语句,但需要开发人员自己处理查询参数,用不好容易造成sql注入风险,以前旧版本用,新版本推荐用内插值方法。

二、执行实体相关查询原生sql语句

如果要执行的原生sql是一个查询语句,并且查询结果也能对应一个实体,就可以调用对应实体的DbSet的FormSqlInterPolated()方法来执行一个查询sql语句,同样使用字符串内插来传递参数

SQL        select newid()        可用作随机排序

like时需要参数传入"%中%",不能把%直接放入字符串中

SQL        子查询中不能使用order By

把只能用原生sql语句写的逻辑用FormSqlInterPolated()去执行,然后把分页,分组,二次过滤,排序,Include等其他逻辑尽可能仍然使用EFCore的标准操作去实现

局限性

1、sql查询必须返回实体类型对应数据库表的所有列;

2、结果集中的列名必须与属性映射的列名称匹配;

3、只能单表查询,不能使join语句进行关联查询,但是可以在查询后面使用Include()来进行关联数据的获取;

三、EFCore执行任意原生sql查询语句

什么时候需要ADO.NET

不推荐使用视图,存储过程

执行任意sql

ADO.NET 演示,操作太复杂不推荐

Dapper框架

演示,1、建对应DTO对象        2、Query方法

总结

四、EFCore如何知道实体数据变了

演示,SaveChanges时奇怪的地方,与数据库不一致的才会执行修改

快照更改跟踪,概念

实体的状态:已添加(Added),未改变(Unchanged),

已修改(Modified),已删除(Deleted),已分离/未跟踪(Datached)

Savechanges的操作

EntityEntry

1、使用DbContext的Entry()方法来获得实体在EFCore中的跟踪信息对象EntityEntry,EntityEntry类的State属性代表实体的状态,通过DebugView.LongView属性可以看到实体的变化信息

2、代码演示

总结:DbContext会根据跟踪的实体的状态,在SaveChanges()的时候根据实体状态的不同,生成update,delete,inster等sql语句,来把内存中实体的变化更新到数据库中。这就是SaveChanges的原理

五、EFCore优化之AsNoTracking

如果查询出来的对象不会被修改,删除等吗,那么查询时可以用AsNoTracking(),就能降低内存占用;不需要跟踪状态,不需要快照

代码演示

六、EFCore实体状态跟踪的妙用(不推荐使用)

修改和删除只执行一句sql语句,不用执行查询sql,可以性能优化,但代码可读性不强,难维护,提升微乎其微,弊大于利,不推荐使用;

七、EFCor数据的批量删除、更新、插入

SQLBulkCopy        可以一次性把很多数据插入到数据库中

演示,EFCore批量修改、删除、插如实体n条sql会执行

为什么不用sql实现

a、原生sql语句需要把表名、列名等硬编码到sql语句中,不符合模型驱动,分层隔离等思想,程序员直接面对数据库表,无法利用EFCore强类型的特性,如果模型发生改变,必须手动变更sql语句;

b、无法利用EFCore强大的sql翻译机制来屏蔽不同底层数据库的差异

c、EFCore官方迟迟未支持的原因

与EFCore实体状态跟踪冲突,会导致状态混乱

我的开源实现        Zack.EFCore.Batch 包

批量删除、更新、插入        使用方法,官方文档

演示

八、全局查询筛选器

EFCore会自动将这个查询筛选器应用于涉及这个实体类型的所有Linq查询

场景:软删除,多租户(eg:商城系统商家入驻,每条记录都带有商户ID)

软删除概念,代码演示

builder.HasQueryFilter(a=>a.IsDeleted == false);

忽略:ctx.Books.IgnoreQueryFilters().Where(b=>b.Age>10).ToArray();

全局筛选器的性能陷阱:数据量大时,可能会造成全表扫描,根据情况优化系统,如:聚集索引

.NET Core 之 七 EF Core(五)相关推荐

  1. .NET Core 之 七 EF Core(四)

    一.有了IEnumerable 还要IQueryable干什么 普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句后给数据库 ...

  2. .NET Core 之 七 EF Core(二)

    杨中科老师视频 .NET 5教程,.Net Core 2021视频教程,杨中科主讲_哔哩哔哩_bilibili 一.主键不是小事,数据库设计.优化 EF Core 支持多种主键生成策略:自动增长,Gu ...

  3. ef core mysql 字符集,EF Core 基础知识

    数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...

  4. mysql多租户schema复制,Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作...

    前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...

  5. 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)

    系统必备 .NET Core 2.0.0 SDK 或更高版本. 已安装 ASP.NET 和 Web 开发工作负载的 Visual Studio 2017 15.3 版或更高版本. 创建Web应用程序 ...

  6. 用于存储过程的ASP.NET Core Blazor和EF Core原始SQL查询

    目录 介绍 背景 先决条件 使用代码 创建数据库和表 步骤1:创建ASP.NET Core Blazor服务器应用程序 运行测试应用程序 步骤2:安装软件包 连接字符串 步骤3:建立模型类 创建DBC ...

  7. EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案

    如果你使用命令: PM> add-migration Inital 提示如下信息时: The EF Core tools version '2.1.1-rtm-30846' is older t ...

  8. Asp.net core 学习笔记 ( ef core )

    更新: 2019-06-12 不小心踩坑 var adidas = new Supplier { name = "adidas" }; Db.Suppliers.Add(adida ...

  9. 用ASP.NET Core MVC 和 EF Core 构建Web应用 (六)

    前面创建了学校数据模型. 本节将读取并显示相关数据 - 即 Entity Framework 加载到导航属性中的数据. 相关数据的预先加载.显式加载和延迟加载 对象关系映射 (ORM) 框架(如 En ...

  10. ASP.NET Core MVC 和 EF Core 教程 - 创建、读取、更新和删除

    作者:Tom Dykstra 和 Rick Anderson Contoso 大学示例 web 应用程序演示如何使用 Entity Framework Core 和 Visual Studio 创建 ...

最新文章

  1. Java Enumeration接口
  2. 【转】Word2007中不连续页码设置 多种页码设置
  3. java Character类的一些简单的方法
  4. SAP 如何将无序列号的库存与序列号关联起来?
  5. python3下关于copy和deepcopy中的区别
  6. SharePoint 2007 文件夹或者文件名过长
  7. 反激qr工作原理_锂电池均衡电路的工作原理
  8. 就是好骑!骑ofo小黄蜂和舒畅早晨say hi,跟闹心堵车say bye
  9. redis之mq实现发布订阅模式
  10. Spring MVC 使用优化建议-缓存URL
  11. 用EnumMaps映射枚举键
  12. 有25匹马,5条赛道
  13. 二维数组的遍历之查漏补缺
  14. Java通过 p12 建立ssl链接
  15. OpenLayers 加载 百度 地图
  16. Javascrpt测试
  17. 自动驾驶/机器人 SLAM算法 面经1
  18. 华为系统更新后通知栏变大了_华为EMUI又有新变动,通知栏新增多功能,流畅度堪比氢OS!...
  19. Windows下代码比较工具Meld diff 以及 VScode配置,解决“Meld Diff Error: Error running diff command! StdErr: ‘meld‘ �
  20. 物理专业要用的计算机语言,16岁被保送清华,本科毕业进麻省理工读博,现开发Taichi爆红网络...

热门文章

  1. mysql ibd文件删除_误删除MySQL数据库表的ibd文件怎么办
  2. Android 猜歌曲游戏开发
  3. oa处理会签流程图_关于合同会签oa流程使用说明..doc
  4. HDU 2102 拯救公主
  5. 关于神舟笔记本电脑结束睡眠后耳机没声音的解决方法
  6. Java-如何防止XSS攻击
  7. pip install 使用豆瓣源
  8. iPad和iPhone开发的异同
  9. java openssl rsa_Java中使用OpenSSL生成的RSA公私钥进行数据加解密
  10. KMPlayer怎么加速播放 KMPlayer加速播放方法