Entity Framework 之存储过程篇
最近几天在搞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 目前不支持的。我拿着小板凳坐等。。