Entity Framework Core系列教程-24-使用存储过程

2023-11-16

在Entity Framework Core中使用存储过程

在这里,您将学习如何在Entity Framework Core中执行数据库存储过程。
EF Core提供了以下方法来执行存储过程:

  1. DbSet<TEntity>.FromSql()
  2. DbContext.Database.ExecuteSqlCommand()

在EF Core2中使用FromSql或ExecuteSqlCommand方法执行数据库存储过程存在一些限制:
结果必须是实体类型。这意味着存储过程必须返回实体对应表的所有列。
结果不能包含相关数据。这意味着存储过程无法执行JOIN来表示结果。
插入,更新和删除过程无法与该实体映射,因此SaveChanges方法无法为CUD操作调用存储过程。
在EF Core中执行存储过程之前,让我们在MS SQL Server中创建存储过程。
如果遵循database-first 方法,则在本地SQL Server数据库中执行以下脚本:

USE [SchoolDB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[GetStudents]
            @FirstName varchar(50)
        AS
        BEGIN
            SET NOCOUNT ON;
            select * from Students where FirstName like @FirstName +'%'
        END
GO

如果您遵循code-first方法,请按照以下步骤操作:

  1. 通过在NPM(NuGet程序包管理器)中执行以下命令来添加空迁移:
Add-migration sp-GetStudents

2.在<DateTime> _sp-GetStudents.cs中的空迁移类的Up方法中编写以下代码:

public partial class spGetStudents : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        var sp = @"CREATE PROCEDURE [dbo].[GetStudents]
                    @FirstName varchar(50)
                AS
                BEGIN
                    SET NOCOUNT ON;
                    select * from Students where FirstName like @FirstName +'%'
                END";

        migrationBuilder.Sql(sp);
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {

    }
}
  1. 在控制台中执行以下命令,在数据库中创建以上存储过程:
Update-database

这将在SQL Server数据库中创建GetStudents存储过程。

使用FromSql执行存储过程

如上一章所述,DbSet的FromSql方法可用于对基础数据库执行原始SQL查询。同样,它可用于执行返回实体数据的存储过程,但有一些限制。
在数据库中,我们可以使用如下INPUT参数值执行GetStudents存储过程:

GetStudents "Bill"
-- or
exec GetStudents "Bill"

您可以按照与上述相同的方式在EF Core中使用FromSql方法执行SP,如下所示。

var context = new SchoolContext(); 
var students = context.Students.FromSql("GetStudents 'Bill'").ToList();

您还可以使用C#字符串插值语法传递参数值,如下所示。

var name = "Bill";

var context = new SchoolContext(); 
var students = context.Students
                      .FromSql($"GetStudents {name}")
                      .ToList();
//or
//var students = context.Students.FromSql($"exec GetStudents {name}").ToList();

使用SqlParameter实例指定IN或OUT参数的值,如下所示:

var context = new SchoolContext(); 
var param = new SqlParameter("@FirstName", "Bill");
//or
/*var param = new SqlParameter() {
                    ParameterName = "@FirstName",
                    SqlDbType =  System.Data.SqlDbType.VarChar,
                    Direction = System.Data.ParameterDirection.Input,
                    Size = 50,
                    Value = "Bill"
};*/

var students = context.Students.FromSql("GetStudents @FirstName", param).ToList();

您还可以为第一个参数指定@ p0,为第二个参数指定@ p1,依此类推。

var context = new SchoolContext(); 
var students = context.Students.FromSql("GetStudents @p0","Bill").ToList();

在以上示例中,@ p0用于第一个参数,因为EF Core中尚不支持命名参数。
注意:默认情况下,DbContext将跟踪结果中的所有实体。如果您多次使用相同的参数执行相同的存储过程,则它将每次执行相同的SQL语句,但只会跟踪一个结果集。例如,以下示例将执行GetStudents存储过程3次,但将仅缓存和跟踪结果的一个副本。

var context = new SchoolContext(); 
var list1 = context.Students.FromSql("GetStudents 'Bill'").ToList();
var list2 = context.Students.FromSql("GetStudents 'Bill'").ToList();
var list3 = context.Students.FromSql("GetStudents 'Bill'").ToList();

使用ExecuteSqlCommand()执行存储过程

ExecuteSqlCommand()方法用于以字符串形式执行数据库命令。对于受指定命令影响的行数,它返回一个整数。

var context = new SchoolContext(); 

var rowsAffected = context.Database.ExecuteSqlCommand("Update Students set FirstName = 'Bill' where StudentId = 1;");

在上面的示例中,update命令在ExecuteSqlCommand方法中传递。 rowsAffected的值将为1,因为只有1行受指定的update命令影响。
同样,我们可以执行存储过程来创建,更新和删除命令。考虑以下存储过程,该存储过程将一条记录插入数据库的Student表中:

CREATE PROCEDURE CreateStudent
    @FirstName Varchar(50),
    @LastName Varchar(50)
AS
BEGIN
    SET NOCOUNT ON;
    Insert into Students(
           [FirstName]
           ,[LastName]
           )
 Values (@FirstName, @LastName)
END
GO

现在,您可以执行上面的存储过程:

var context = new SchoolContext(); 

context.Database.ExecuteSqlCommand("CreateStudents @p0, @p1", parameters: new[] { "Bill", "Gates" });

以相同的方式,您可以执行Update和Delete命令的存储过程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core系列教程-24-使用存储过程 的相关文章

  • LayUi介绍&前言

    目录 1 什么是layui 2 layui easyui与bootstrap的对比 有趣的对比方式 嘿嘿嘿 easyui jquery html4 用来做后台的管理界面 半老徐娘 bootstrap jquery html5 美女 拜金 l
  • 《学会提问:批判性思维指南》

    批判性思维的三个方面 1 有一套相互关联 环环相扣的关键问题的意识 2 恰如其分地提出和回答关键问题的能力 3 积极主动地利用问题的强烈愿望 思维方式 海绵式思维 1 吸收外部世界的信息越多 就越有头绪 2 被动的方式 不知如何取舍 淘金式
  • XPath提取网页数据(附实例)

    文章目录 一 XPath语法 二 用Python实践 Python爬虫的两个思路 三 三个案例 完整代码 一 XPath语法 借助Chrome浏览器的XPath插件来学习XPath语法 网页测试无误再把规则拿下来写代码 视频学习链接 网络爬
  • java 泛型多重限制,java中基于超类和子类的泛型类型的多重限制

    I have a generic list class that implements a particular interface The list items in the interface also implement the sa
  • B树、B-树、B+树的定义和区分

    B 树 B 树又名B树 我们把所有的数据进行折半块查找 比如一共100条数据 在30和60的地方分一下 存放30和60的节点就是根节点 30和60就是该节点的关键字 100也就是分成了3份 这个节点自动创建三个指针 这三份就是根节点的子节点
  • linux查看系统属性

    系统 uname a 查看内核 操作系统 CPU信息 head n 1 etc issue 查看操作系统版本 cat proc cpuinfo 查看CPU信息 hostname 查看计算机名 lspci tv 列出所有PCI设备 lsusb

随机推荐

  • DDSM数据库使用说明

    一 官网下载 我们的下载工具是winscp软件 该软件可以用于远程ftp下载 首先 在网上搜索安装包进行下载安装 安装之后 打开软件 选择ftp 输入DDSM网址 匿名登录 等待连接以后 就可以看到我们需要下载的资源 然后选择我们需要下载的
  • Xcode7.1环境下上架iOS App到AppStore 流程 (Part 一)

    前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 目前iTunesConnect 都已经迭代好几个版本了和之前的 界面风格还是有很大的差别的 后面自己折腾了好久才终于把自己的App上架 所以一直想写个最新 Xc
  • TortoiseGit工具 修改登录用户名密码

    TortoiseGit是大家常用的git客户端 操作起来非常的简便 但是当账号密码变化之后 再使用TortoiseGit操作git就会提示没有权限 那么 TortoiseGit怎么修改用户名密码呢 下面本文就介绍一下 方法 步骤 首先 打开
  • umi配置chainWebpack,使用自定义loader----jsx-px2rem

    目录 吐槽 loader 修改chainWebpack配置 完结 吐槽 最初追随潮流 老大看到了umi这个国人开发标签的框架 觉得可以尝试 并且相信阿里 从此开始了填坑之路 虽然云谦大佬在github上说了 umi本身的配置已经很完善了 但
  • win10+ubuntu20.04 双系统卸载ubuntu20.04

    清除Ubuntu系统分区 使用磁盘管理器比较省事 也可使用diskgenius 打开磁盘管理器后可以看到Ubuntu分区 如图所示 右键删除卷即可 删除开启引导启动项 删除了Ubuntu系统所有分区后 Windows的EFI分区里仍然会有U
  • Linux下C编译系统

    Linux下C编译系统 编译过程概述 了解一些编译知识的读者都知道 所谓编译 就是在编译程序读取源程序 字符流 对之进行词法和语法的分析 将高级语言指令转换为功能等效的汇编代码 再由汇编程序转换为机器语言 并且按照操作系统对可执行文件感谢格
  • 蓝桥杯第十四届省赛完整题解 C/C++ B组

    没有测评 不知道对不对 仅仅过样例而已 试题 A 日期统计 本题总分 5 分 问题描述 小蓝现在有一个长度为 100 的数组 数组中的每个元素的值都在 0 到 9 的 范围之内 数组中的元素从左至右如下所示 5 6 8 6 9 1 6 1
  • 虚拟服务器lan网段地址,lan侧服务器ip地址

    lan侧服务器ip地址 内容精选 换一换 云平台支持修改主网卡的私有IP地址 具体操作请参见本节内容 如需修改扩展网卡的私有IP地址 请删除网卡 并挂载新网卡 云服务器已关机 如果网卡绑定了虚拟IP或者DNAT规则 需要先解绑 如果网卡上有
  • 双向交错CCM图腾柱无桥单相PFC学习仿真与实现(2)SOGI_PLL学习仿真总结

    目录 前言 SOGI基本原理 锁相环基本原理 仿真实现及说明 总结 前言 前面总结了双向交错CCM图腾柱无桥单相PFC系统实现 后面把问题细分 关于SOGI锁相环的应用和学习在这里总结下 双向交错CCM图腾柱无桥单相PFC学习仿真与实现 1
  • 大数据流处理(Spark Streaming + Kafka)面试常考考点

    1 ack Kafka Producer的参数 是把数据写到Kafka broker里面去时需要的参数 常见的值有1 0 all 1 0 leader不做等待 只管发不管结果 延时性最低 持久性最差 1 默认 只要leader写数据到本地即
  • Windows 安装 Nginx

    Nginx下载nginx documentation Nginx 是一个高性能的网页服务器 能够反向代理HTTP HTTPS SMTP POP3 IMAP的协议链接 也可以作为一个负载均衡器和 HTTP 缓存 是一个免费 开源 高性能的 H
  • LeGO-LOAM建图

    1 安装LeGO LOAM LeGO LOAM需要依赖 ROS 环境 和 gtsam 遇到github下载慢的情况 可以从gitee导入仓库下载 1 1安装依赖项 wget wget O software gtsam zip https g
  • win10程序员计算器面板按钮介绍

    HEX 十六进制 DEC 十进制 OCT 八进制 BIN 二进制 注意这里的二进制为二进制补码形式 每输入一个数 进制转换会自动进行 QWORD 四字 64位 DWORD 双字 32位 WORD 字 16位 BYTE 字节 8位 Lsh 左
  • 递归实现逆序输出整数——C语言

    本题目要求读入1个正整数n 然后编写递归函数reverse int n 实现将该正整数逆序输出 输入格式 输入在一行中给出1个正整数n 输出格式 对每一组输入 在一行中输出n的逆序数 输入样例 12345 结尾无空行 输出样例 54321
  • BFC渲染机制

    BFC block formatting context 块级格式化上下文 实际就是一个隔离罩 W3C CSS2 1 规范中的一个概念 它是页面中的一块渲染区域 并且有一套渲染规则 它决定了其子元素将如何定位 以及和其他元素的关系和相互作用
  • 2013年9月24日星期二(demo5_1参数化2D直线)

    现在很想封装下3D的 将所谓的难度踏在脚下 好 现在准备了 代码到哪里 分析到哪里 首先 包含各种头文件 include common h include DDraw Interface h using namespace std HWND
  • iMazing传输 iPhone 备忘录和通话记录功能

    对于经常需要进行客户联系的业务员来说 通过整理通话记录 能够统计到拜访客户的次数 效果等数据 如果是通过手动统计的方式 将耗费大量的时间与精力 iMazing为苹果设备用户提供了功能齐全的通话管理功能 用户可以通过使用该功能 查询相关的通话
  • 使用Python搭建代理服务器- 爬虫代理服务器详细指南

    搭建一个Python爬虫代理服务器可以让你更方便地管理和使用代理IP 下面是一个详细的教程来帮助你搭建一个简单的Python爬虫代理服务器 1 首先 确保你已经安装了Python 你可以在官方网站 https www python org
  • 打开c语言生成exe文件,出现闪退的解决方法

    额 在给大一学弟上第一节实验课的时候 经常有学弟问我 为什么打开c语言生成的exe文件 立马闪退 起初个别问的时候 我只是简单的说明程序运行完了 就自动关了 现在先不用涉及这个 以后自然懂了 但是后来问的人多了 我就觉得有必要先给他们提一下
  • Entity Framework Core系列教程-24-使用存储过程

    在Entity Framework Core中使用存储过程 在这里 您将学习如何在Entity Framework Core中执行数据库存储过程 EF Core提供了以下方法来执行存储过程 DbSet