最近幾天在搞CRUD,使用的是EF這個ORM,最近的項目中上了存儲過程,就把在開發中的經驗分享出來!我們先創建一個最基本的存儲過程,腳本如下,這是一個不帶參數的存儲過程,我們從最簡單的往上走!
create procedure dbo.ProductsSel AS BEGIN SELECT * FROM Products END GO
那么我們API中實際上就是執行了SQL,那么其實這非常簡單,都是通過EXECUTE 存儲過程名,由於我是用的是.NET Core那么無法可視化去創建EF,命令如下:
Scaffold-DbContext "Server=.;database=EFCore;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Model
其中的這個注釋可以刪除,里面就是一些關於表的配置,表結構啊什么的。

以FromSql方式調用存儲過程
[Produces("application/json")] [Route("api/Banner")] public class BannerController : Controller { [HttpGet] public IEnumerable<Products> GetProducts() { using (EFCoreContext efcore = new EFCoreContext()) { var query = efcore.Products.FromSql("execute dbo.ProductsSel"); return query.ToList(); } } }
下面我們使用PostMan進行測試。

如何帶參?呵呵,可能你已經想到了,只不過還是sql的問題,當然我們需要去修改一下我們的存儲過程。修改后的腳本如下。
create procedure dbo.ProductsSel @cid int AS BEGIN SELECT * FROM Products Where ProductId = @cid END GO
調用
[HttpGet] public IEnumerable<Products> GetProductsById(int id) { var paramter = new SqlParameter { DbType = System.Data.DbType.Int32, ParameterName = "cid", Value = id }; using (EFCoreContext efcore = new EFCoreContext()) { var query = efcore.Products.FromSql("execute dbo.ProductsSel @cid",paramter); return query.ToList(); } }

除了以這種東東,還有一個類叫做RelationalDatabaseFacadeExtensions,這里面提供了執行CRUD操作的類。以下是類的結構:

最簡單的就可以這么寫。
string sql ="select * from xxx" efcore.Database.ExecuteSqlCommand(sql);
如果你在看這方面內容,SqlQuery這個是EF Core 目前不支持的。我拿着小板凳坐等。。
