中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在.net core EF中調用存儲過程

發布時間:2021-06-09 17:01:56 來源:億速云 閱讀:373 作者:Leah 欄目:開發技術

如何在.net core EF中調用存儲過程?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1、FromSql,官方文檔

DbSet<TEntity>.FromSql()

2、執行SQl命令

DbContext.Database.ExecuteSqlCommand()

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

1、FromSql方式的結果一定要是實體類型,就是數據庫表映射的模型。這意味著,執行存儲過程返回的結果一定是跟數據庫表相關的所有字段;

2、FromSql方式的結果不能有關聯關系數據。這就相當于不能 join ,也返回不了 join 的關聯表的數據。

3、ExecuteSqlCommand執行插入、更新跟刪除的存儲過程不能直接映射到實體(EF Core不支持嘛,在講 EF 跟 EF Core 的區別時已經很清晰了),所以,CUD 方法不能直接調用 SaveChanges 方法。

我們來試試演示一下:

(1)準備一個存儲過程,一般為了方便,直接就是 DB-First,執行以下的 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

當創建好了這個有傳參的有返回結果的存儲過程的時候,數據庫在可編程性下就有一個存儲過程了(這個數據庫是我專門用來做demo的)

如何在.net core EF中調用存儲過程

(2)用 FromSql 調用存儲過程,由上面就可以知道它是 DbSet 的方法,而 DbSet 是可以執行原生的 sql 語句去查詢底層的數據庫。同樣,使用 DbSet 可以執行存儲過程,從而返回實體類型,但就是具有上面所說的局限性罷了。

//用 FromSql 調存儲過程
   var name = "C";

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

   //or 使用 exec 關鍵字調用存儲過程
   //var books = _context.Books.FromSql($"exec proc_getbooks {name}").ToList();

   //or 使用 SqlParameter 實例進行參數的插入
   //var param = new SqlParameter()
   //{
   // ParameterName = "@name",
   // SqlDbType = System.Data.SqlDbType.NVarChar,
   // Direction = System.Data.ParameterDirection.Input,
   // Size = 50,
   // Value = name
   //};

   //or 使用 @p0 代表第一個參數,則 @p1 就代表第二個參數等以此類推
   //var books = _context.Books.FromSql("proc_getbooks @p0", name).ToList();

同樣,在這里值得一提的是,當我們多次調用同一個存儲過程,傳遞同樣的參數的時候,比如像下面:

//用 FromSql 多次調同一個存儲過程
   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();

所有的實體默認(可以設置)都會被 DbContext 進行跟蹤。如果你執行同樣的存儲過程,傳同樣的參數的時候,進行多次執行的時候,相當于執行同樣的 sql 語句多次,但返回的結果確認一樣的, 根據DbContext 的跟蹤,直接就獲取緩存進行返回結果了。就是說,存儲過程會被調用多次,但只查了一次數據庫,其他的在緩存里拿數據。

(3)用ExecuteSqlCommand 調用存儲過程,這個跟 EF 是一個毛樣的,由于要測試的話,還要創建一個存儲過程,因為這個執行查詢沒有意義,如果你看它的返回的話,都是 int 類型,而且返回結果都是影響的行數。

如何在.net core EF中調用存儲過程

看看源碼:

如何在.net core EF中調用存儲過程

其實 ExecuteSqlCommand 最終是調用 ExecuteNonQuery,就是執行非查詢的語句,返回影響的行數,也驗證了剛才所說的。

如何在.net core EF中調用存儲過程

扯遠了,那么再創建一個存儲過程吧

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

創建后

如何在.net core EF中調用存儲過程

來調用以下試試:

   //用 ExecuteSqlCommand 調存儲過程, 用parameters: new[] {}也是可以的
   var name = "C# 高級進階";
   var author = "-";
   var cateid = 1;
   _context.Database.ExecuteSqlCommand("proc_createbook @p0,@p1,@p2", name, author, cateid);

執行結果:

如何在.net core EF中調用存儲過程

看完上述內容,你們掌握如何在.net core EF中調用存儲過程的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄梅县| 石屏县| 绵竹市| 大英县| 高要市| 沈阳市| 七台河市| 吉林市| 六枝特区| 泸溪县| 五家渠市| 米易县| 山东| 土默特左旗| 澜沧| 家居| 扬州市| 安丘市| 勃利县| 河北区| 舟山市| 穆棱市| 惠来县| 罗平县| 阿拉尔市| 沁水县| 纳雍县| 乾安县| 梅河口市| 南阳市| 太仆寺旗| 大石桥市| 黄山市| 芜湖市| 碌曲县| 荔浦县| 叙永县| 泗洪县| 南郑县| 清流县| 沐川县|