.net core EF Core調(diào)用存儲(chǔ)過程的方式
前言
在這里,我們將嘗試去學(xué)習(xí)一下 .net core EF Core 中調(diào)用存儲(chǔ)過程。
我們知道,EF Core 是不支持直接調(diào)用存儲(chǔ)過程的,那它又提供了什么樣的方式去執(zhí)行存儲(chǔ)過程呢?有如下方法:
1、FromSql,官方文檔
DbSet<TEntity>.FromSql()
2、執(zhí)行SQl命令
DbContext.Database.ExecuteSqlCommand()
但是,這兩種方式都有局限性:
1、FromSql方式的結(jié)果一定要是實(shí)體類型,就是數(shù)據(jù)庫表映射的模型。這意味著,執(zhí)行存儲(chǔ)過程返回的結(jié)果一定是跟數(shù)據(jù)庫表相關(guān)的所有字段;
2、FromSql方式的結(jié)果不能有關(guān)聯(lián)關(guān)系數(shù)據(jù)。這就相當(dāng)于不能 join ,也返回不了 join 的關(guān)聯(lián)表的數(shù)據(jù)。
3、ExecuteSqlCommand執(zhí)行插入、更新跟刪除的存儲(chǔ)過程不能直接映射到實(shí)體(EF Core不支持嘛,在講 EF 跟 EF Core 的區(qū)別時(shí)已經(jīng)很清晰了),所以,CUD 方法不能直接調(diào)用 SaveChanges 方法。
我們來試試演示一下:
(1)準(zhǔn)備一個(gè)存儲(chǔ)過程,一般為了方便,直接就是 DB-First,執(zhí)行以下的 SQL 腳本就OK了
USE [Library] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[proc_getbooks] @name nvarchar(50) AS BEGIN SET NOCOUNT ON; select * from books where name like @name +'%' END GO
當(dāng)創(chuàng)建好了這個(gè)有傳參的有返回結(jié)果的存儲(chǔ)過程的時(shí)候,數(shù)據(jù)庫在可編程性下就有一個(gè)存儲(chǔ)過程了(這個(gè)數(shù)據(jù)庫是我專門用來做demo的)

(2)用 FromSql 調(diào)用存儲(chǔ)過程,由上面就可以知道它是 DbSet 的方法,而 DbSet 是可以執(zhí)行原生的 sql 語句去查詢底層的數(shù)據(jù)庫。同樣,使用 DbSet 可以執(zhí)行存儲(chǔ)過程,從而返回實(shí)體類型,但就是具有上面所說的局限性罷了。
//用 FromSql 調(diào)存儲(chǔ)過程
var name = "C";
var books = _context.Books
.FromSql($"proc_getbooks {name}")
.ToList();
//or 使用 exec 關(guān)鍵字調(diào)用存儲(chǔ)過程
//var books = _context.Books.FromSql($"exec proc_getbooks {name}").ToList();
//or 使用 SqlParameter 實(shí)例進(jìn)行參數(shù)的插入
//var param = new SqlParameter()
//{
// ParameterName = "@name",
// SqlDbType = System.Data.SqlDbType.NVarChar,
// Direction = System.Data.ParameterDirection.Input,
// Size = 50,
// Value = name
//};
//or 使用 @p0 代表第一個(gè)參數(shù),則 @p1 就代表第二個(gè)參數(shù)等以此類推
//var books = _context.Books.FromSql("proc_getbooks @p0", name).ToList();
同樣,在這里值得一提的是,當(dāng)我們多次調(diào)用同一個(gè)存儲(chǔ)過程,傳遞同樣的參數(shù)的時(shí)候,比如像下面:
//用 FromSql 多次調(diào)同一個(gè)存儲(chǔ)過程
var name = "C";
var list1 = _context.Books.FromSql($"proc_getbooks {name}").ToList();
var list2 = _context.Books.FromSql($"proc_getbooks {name}").ToList();
var list3 = _context.Books.FromSql($"proc_getbooks {name}").ToList();
所有的實(shí)體默認(rèn)(可以設(shè)置)都會(huì)被 DbContext 進(jìn)行跟蹤。如果你執(zhí)行同樣的存儲(chǔ)過程,傳同樣的參數(shù)的時(shí)候,進(jìn)行多次執(zhí)行的時(shí)候,相當(dāng)于執(zhí)行同樣的 sql 語句多次,但返回的結(jié)果確認(rèn)一樣的, 根據(jù)DbContext 的跟蹤,直接就獲取緩存進(jìn)行返回結(jié)果了。就是說,存儲(chǔ)過程會(huì)被調(diào)用多次,但只查了一次數(shù)據(jù)庫,其他的在緩存里拿數(shù)據(jù)。
(3)用ExecuteSqlCommand 調(diào)用存儲(chǔ)過程,這個(gè)跟 EF 是一個(gè)毛樣的,由于要測(cè)試的話,還要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)過程,因?yàn)檫@個(gè)執(zhí)行查詢沒有意義,如果你看它的返回的話,都是 int 類型,而且返回結(jié)果都是影響的行數(shù)。

看看源碼:

其實(shí) ExecuteSqlCommand 最終是調(diào)用 ExecuteNonQuery,就是執(zhí)行非查詢的語句,返回影響的行數(shù),也驗(yàn)證了剛才所說的。

扯遠(yuǎn)了,那么再創(chuàng)建一個(gè)存儲(chǔ)過程吧
CREATE PROCEDURE [dbo].[proc_createbook] @name Varchar(50), @author Varchar(50), @cateid int AS BEGIN SET NOCOUNT ON; Insert into books( [name] ,[author] ,[createtime] ,[isdel] ,[cateid] ) Values (@name, @author,GETDATE(),0,@cateid) END GO
創(chuàng)建后

來調(diào)用以下試試:
//用 ExecuteSqlCommand 調(diào)存儲(chǔ)過程, 用parameters: new[] {}也是可以的
var name = "C# 高級(jí)進(jìn)階";
var author = "-";
var cateid = 1;
_context.Database.ExecuteSqlCommand("proc_createbook @p0,@p1,@p2", name, author, cateid);
執(zhí)行結(jié)果:

OK,是可以執(zhí)行成功的。
到這里先完成第一部分先,接下來就做調(diào)用存儲(chǔ)過程的擴(kuò)展,因?yàn)閱慰窟@兩種調(diào)用方式,我們是不會(huì)滿足的!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- C# Ado.net實(shí)現(xiàn)讀取SQLServer數(shù)據(jù)庫存儲(chǔ)過程列表及參數(shù)信息示例
- .net core2.0下使用Identity改用dapper存儲(chǔ)數(shù)據(jù)(實(shí)例講解)
- ASP.NET MVC用存儲(chǔ)過程批量添加修改數(shù)據(jù)操作
- asp.net中調(diào)用存儲(chǔ)過程的方法
- asp.net中調(diào)用oracle存儲(chǔ)過程的方法
- VB.NET調(diào)用MySQL存儲(chǔ)過程并獲得返回值的方法
- .Net下二進(jìn)制形式的文件(圖片)的存儲(chǔ)與讀取詳細(xì)解析
- .NET中的字符串在內(nèi)存中的存儲(chǔ)方式
相關(guān)文章
asp.net中簡(jiǎn)體轉(zhuǎn)繁體實(shí)現(xiàn)代碼
最近到了臺(tái)企,什么都要用繁體的。開發(fā)中也遇到了簡(jiǎn)繁體轉(zhuǎn)換的問題。這里和朋友們分享一下用.net實(shí)現(xiàn)簡(jiǎn)繁體轉(zhuǎn)換的經(jīng)驗(yàn)。2010-03-03
NLog路由規(guī)則和上下文信息知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給各位整理的是關(guān)于NLog路由規(guī)則和上下文信息的相關(guān)文章,有需要的朋友們學(xué)習(xí)下。2019-10-10
asp.net防止刷新時(shí)重復(fù)提交(可禁用工具條刷新按鈕)
前段時(shí)間遇到了需要禁用刷新的需求,f5按鈕就不說了,簡(jiǎn)單的js就能把它禁用,但是工具條上的刷新按鈕卻防止不了啊,不過本文介紹的一種方法卻可以解決此問題,感興趣的朋友可以了解下啊,希望本文對(duì)你有所幫助2013-01-01
visual studio 2017企業(yè)版本安裝(附序列號(hào))
這篇文章主要介紹了visual studio 2017企業(yè)版本安裝,文末為大家分享了序列號(hào),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
如何使用Python實(shí)現(xiàn)阿拉伯?dāng)?shù)字轉(zhuǎn)換成中國(guó)漢字
本文提供了一個(gè)Python代碼示例,用于將阿拉伯?dāng)?shù)字轉(zhuǎn)換為中文漢字表示,代碼定義了數(shù)字到漢字的映射表,并實(shí)現(xiàn)了處理不同位數(shù)(如個(gè)、十、百、千、萬等)的函數(shù),特別地,處理方式包括對(duì)大數(shù)字的分解和轉(zhuǎn)換,以及對(duì)連續(xù)零的特殊處理,感興趣的朋友跟隨小編一起看看吧2024-09-09
WPF實(shí)現(xiàn)定時(shí)刷新UI界面功能
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)定時(shí)刷新UI界面功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題
這篇文章主要介紹了解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題的相關(guān)資料,需要的朋友可以參考下2016-09-09
.net mvc超過了最大請(qǐng)求長(zhǎng)度的解決方法
這篇文章主要為大家詳細(xì)介紹了.net mvc超過了最大請(qǐng)求長(zhǎng)度的解決方法,限制文件上傳大小,感興趣的小伙伴們可以參考一下2016-07-07

