Entity Framework 之存储过程篇

C#

浏览数:383

2019-7-2

最近几天在搞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 目前不支持的。我拿着小板凳坐等。。

作者:张子浩