.NET Core 之 七 EF Core(五)
一、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(五)相关推荐
- .NET Core 之 七 EF Core(四)
一.有了IEnumerable 还要IQueryable干什么 普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句后给数据库 ...
- .NET Core 之 七 EF Core(二)
杨中科老师视频 .NET 5教程,.Net Core 2021视频教程,杨中科主讲_哔哩哔哩_bilibili 一.主键不是小事,数据库设计.优化 EF Core 支持多种主键生成策略:自动增长,Gu ...
- ef core mysql 字符集,EF Core 基础知识
数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...
- mysql多租户schema复制,Asp.net core下利用EF core实现从数据实现多租户(3): 按Schema分离 附加:EF Migration 操作...
前言 前段时间写了EF core实现多租户的文章,实现了根据数据库,数据表进行多租户数据隔离. 今天开始写按照Schema分离的文章. 其实还有一种,是通过在数据表内添加一个字段做多租户的,但是这种模 ...
- 用ASP.NET Core MVC 和 EF Core 构建Web应用 (一)
系统必备 .NET Core 2.0.0 SDK 或更高版本. 已安装 ASP.NET 和 Web 开发工作负载的 Visual Studio 2017 15.3 版或更高版本. 创建Web应用程序 ...
- 用于存储过程的ASP.NET Core Blazor和EF Core原始SQL查询
目录 介绍 背景 先决条件 使用代码 创建数据库和表 步骤1:创建ASP.NET Core Blazor服务器应用程序 运行测试应用程序 步骤2:安装软件包 连接字符串 步骤3:建立模型类 创建DBC ...
- EF Core 迁移过程遇到EF Core tools version版本不相符的解决方案
如果你使用命令: PM> add-migration Inital 提示如下信息时: The EF Core tools version '2.1.1-rtm-30846' is older t ...
- Asp.net core 学习笔记 ( ef core )
更新: 2019-06-12 不小心踩坑 var adidas = new Supplier { name = "adidas" }; Db.Suppliers.Add(adida ...
- 用ASP.NET Core MVC 和 EF Core 构建Web应用 (六)
前面创建了学校数据模型. 本节将读取并显示相关数据 - 即 Entity Framework 加载到导航属性中的数据. 相关数据的预先加载.显式加载和延迟加载 对象关系映射 (ORM) 框架(如 En ...
- ASP.NET Core MVC 和 EF Core 教程 - 创建、读取、更新和删除
作者:Tom Dykstra 和 Rick Anderson Contoso 大学示例 web 应用程序演示如何使用 Entity Framework Core 和 Visual Studio 创建 ...
最新文章
- Java Enumeration接口
- 【转】Word2007中不连续页码设置 多种页码设置
- java Character类的一些简单的方法
- SAP 如何将无序列号的库存与序列号关联起来?
- python3下关于copy和deepcopy中的区别
- SharePoint 2007 文件夹或者文件名过长
- 反激qr工作原理_锂电池均衡电路的工作原理
- 就是好骑!骑ofo小黄蜂和舒畅早晨say hi,跟闹心堵车say bye
- redis之mq实现发布订阅模式
- Spring MVC 使用优化建议-缓存URL
- 用EnumMaps映射枚举键
- 有25匹马,5条赛道
- 二维数组的遍历之查漏补缺
- Java通过 p12 建立ssl链接
- OpenLayers 加载 百度 地图
- Javascrpt测试
- 自动驾驶/机器人 SLAM算法 面经1
- 华为系统更新后通知栏变大了_华为EMUI又有新变动,通知栏新增多功能,流畅度堪比氢OS!...
- Windows下代码比较工具Meld diff 以及 VScode配置,解决“Meld Diff Error: Error running diff command! StdErr: ‘meld‘ �
- 物理专业要用的计算机语言,16岁被保送清华,本科毕业进麻省理工读博,现开发Taichi爆红网络...