欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

.net core EF Core調(diào)用存儲(chǔ)過(guò)程的方式

 更新時(shí)間:2019年05月07日 09:23:19   作者:Vam8023  
這篇文章主要給大家介紹了關(guān)于.net core EF Core調(diào)用存儲(chǔ)過(guò)程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用.net core EF Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

在這里,我們將嘗試去學(xué)習(xí)一下 .net core EF Core 中調(diào)用存儲(chǔ)過(guò)程。

我們知道,EF Core 是不支持直接調(diào)用存儲(chǔ)過(guò)程的,那它又提供了什么樣的方式去執(zhí)行存儲(chǔ)過(guò)程呢?有如下方法:

1、FromSql,官方文檔

DbSet<TEntity>.FromSql()

2、執(zhí)行SQl命令

DbContext.Database.ExecuteSqlCommand()

但是,這兩種方式都有局限性:

1、FromSql方式的結(jié)果一定要是實(shí)體類型,就是數(shù)據(jù)庫(kù)表映射的模型。這意味著,執(zhí)行存儲(chǔ)過(guò)程返回的結(jié)果一定是跟數(shù)據(jù)庫(kù)表相關(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ǔ)過(guò)程不能直接映射到實(shí)體(EF Core不支持嘛,在講 EF 跟 EF Core 的區(qū)別時(shí)已經(jīng)很清晰了),所以,CUD 方法不能直接調(diào)用 SaveChanges 方法。

我們來(lái)試試演示一下:

(1)準(zhǔn)備一個(gè)存儲(chǔ)過(guò)程,一般為了方便,直接就是 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ǔ)過(guò)程的時(shí)候,數(shù)據(jù)庫(kù)在可編程性下就有一個(gè)存儲(chǔ)過(guò)程了(這個(gè)數(shù)據(jù)庫(kù)是我專門用來(lái)做demo的)

(2)用 FromSql 調(diào)用存儲(chǔ)過(guò)程,由上面就可以知道它是 DbSet 的方法,而 DbSet 是可以執(zhí)行原生的 sql 語(yǔ)句去查詢底層的數(shù)據(jù)庫(kù)。同樣,使用 DbSet 可以執(zhí)行存儲(chǔ)過(guò)程,從而返回實(shí)體類型,但就是具有上面所說(shuō)的局限性罷了。

//用 FromSql 調(diào)存儲(chǔ)過(guò)程
   var name = "C";

   var books = _context.Books
      .FromSql($"proc_getbooks {name}")
      .ToList();

   //or 使用 exec 關(guān)鍵字調(diào)用存儲(chǔ)過(guò)程
   //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ǔ)過(guò)程,傳遞同樣的參數(shù)的時(shí)候,比如像下面:

//用 FromSql 多次調(diào)同一個(gè)存儲(chǔ)過(guò)程
   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ǔ)過(guò)程,傳同樣的參數(shù)的時(shí)候,進(jìn)行多次執(zhí)行的時(shí)候,相當(dāng)于執(zhí)行同樣的 sql 語(yǔ)句多次,但返回的結(jié)果確認(rèn)一樣的, 根據(jù)DbContext 的跟蹤,直接就獲取緩存進(jìn)行返回結(jié)果了。就是說(shuō),存儲(chǔ)過(guò)程會(huì)被調(diào)用多次,但只查了一次數(shù)據(jù)庫(kù),其他的在緩存里拿數(shù)據(jù)。

(3)用ExecuteSqlCommand 調(diào)用存儲(chǔ)過(guò)程,這個(gè)跟 EF 是一個(gè)毛樣的,由于要測(cè)試的話,還要?jiǎng)?chuàng)建一個(gè)存儲(chǔ)過(guò)程,因?yàn)檫@個(gè)執(zhí)行查詢沒(méi)有意義,如果你看它的返回的話,都是 int 類型,而且返回結(jié)果都是影響的行數(shù)。

看看源碼:

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

扯遠(yuǎn)了,那么再創(chuàng)建一個(gè)存儲(chǔ)過(guò)程吧

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)建后

來(lái)調(diào)用以下試試:

   //用 ExecuteSqlCommand 調(diào)存儲(chǔ)過(guò)程, 用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í)行成功的。

到這里先完成第一部分先,接下來(lái)就做調(diào)用存儲(chǔ)過(guò)程的擴(kuò)展,因?yàn)閱慰窟@兩種調(diào)用方式,我們是不會(huì)滿足的!

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼

    這篇文章主要介紹了Asp.net Core中實(shí)現(xiàn)自定義身份認(rèn)證的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • ASP.NET MVC4 利用uploadify.js多文件上傳

    ASP.NET MVC4 利用uploadify.js多文件上傳

    本文主要介紹了ASP.NET MVC4利用uploadify.js實(shí)現(xiàn)多文件上傳的方法代碼。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 獲取App.config配置文件中的參數(shù)值

    獲取App.config配置文件中的參數(shù)值

    這篇文章介紹了獲取app.config配置文件中的參數(shù)值方法,首先是要添加System.Configuration引用,其次類文件中必須有 using System.Configuration;再次App.config添加,最后向App.config配置文件添加參數(shù),下面通過(guò)列子給大家講解下,需要的朋友可以參考下
    2015-07-07
  • asp.net下XML的加密和解密實(shí)現(xiàn)方法

    asp.net下XML的加密和解密實(shí)現(xiàn)方法

    xml加密(XML Encryption)是w3c加密xml的標(biāo)準(zhǔn)。這個(gè)加密過(guò)程包括加密xml文檔的元素及其子元素,通過(guò)加密,xml的初始內(nèi)容將被替換,但其xml格式仍然被完好的保留。
    2010-02-02
  • 利用EF6簡(jiǎn)單實(shí)現(xiàn)多租戶的應(yīng)用

    利用EF6簡(jiǎn)單實(shí)現(xiàn)多租戶的應(yīng)用

    這篇文章主要給大家介紹了關(guān)于如何利用EF6簡(jiǎn)單實(shí)現(xiàn)多租戶應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用EF6具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • ASP.NET中讀取XML文件信息的4種方法與示例代碼

    ASP.NET中讀取XML文件信息的4種方法與示例代碼

    ASP.NET中讀取XML文件信息的4種方法與示例代碼...
    2007-03-03
  • .Net WebApi消息攔截器之MessageHandler的示例

    .Net WebApi消息攔截器之MessageHandler的示例

    這篇文章主要介紹了.Net WebApi消息攔截器之MessageHandler的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • asp.net后臺(tái)如何動(dòng)態(tài)添加JS文件和css文件的引用

    asp.net后臺(tái)如何動(dòng)態(tài)添加JS文件和css文件的引用

    動(dòng)態(tài)添加JS文件和css文件的引用在asp.net后臺(tái)如何實(shí)現(xiàn)呢?首先添加命名空間 using System.Web.UI.HtmlControls,之后按照下面的步驟操作即可
    2014-09-09
  • 使用.net?core?自帶DI框架實(shí)現(xiàn)延遲加載功能

    使用.net?core?自帶DI框架實(shí)現(xiàn)延遲加載功能

    在某些情況,我們希望能延遲一個(gè)依賴的初始化。如果使用的是autofac,我們可以通過(guò)注入Lazy來(lái)實(shí)現(xiàn),這篇文章主要介紹了使用.net?core?自帶DI框架實(shí)現(xiàn)延遲加載,需要的朋友可以參考下
    2023-02-02
  • Asp.net開(kāi)發(fā)常用的51個(gè)非常實(shí)用的代碼

    Asp.net開(kāi)發(fā)常用的51個(gè)非常實(shí)用的代碼

    Asp.net開(kāi)發(fā)常用的51個(gè)非常實(shí)用的代碼,需要的朋友可以參考下。
    2010-06-06

最新評(píng)論