前言
在这里,我们将尝试了解中调用的存储过程。净芯英孚芯。
我们知道,EF Core不支持直接调用存储过程,那么它提供了什么样的方式来执行存储过程呢?有以下方法:
1.来自Sql,官方文档
DbSetTEntity。from SqL(2)。执行SQl命令
然而,这两种方法都有局限性:
1.FromSql的结果必须是实体类型,这是数据库表映射的模型。这意味着执行存储过程返回的结果必须是与数据库表相关的所有字段;
2.FromSql模式中的结果不能有关联数据。这意味着不能联接,也不能返回联接的关联表的数据。
3.ExecuteSqlCommand执行的插入、更新、删除的存储过程不能直接映射到实体(EF Core不支持,EF和EF Core的区别很明显),所以CUD方法不能直接调用SaveChanges方法。
让我们试着演示一下:
(1)准备一个存储过程,为了方便起见,通常是DB-First,执行下面的SQL脚本就可以了
使用[库]GOSET ANSI _ NULLS ONGOSET QUOTED _ IDENTIFIER ONGOCREATE PROCEDURE[dbo]。[proc _ getbooks]@ name nvarchar(50)AS BEGIN SET NOCOUNT ON;从名称类似@ name“%”的书籍中选择* end go创建带有传递参数和返回结果的存储过程时,数据库中有一个可编程的存储过程(这个数据库是我专门用来演示的)
(2)使用FromSql调用存储过程,从上面可以知道它是DbSet的一种方法,DbSet可以执行原生Sql语句来查询底层数据库。同样,DbSet可以执行存储过程来返回实体类型,但是它有上面提到的限制。
//使用FromSql调整存储过程变量名称=' Cvar books=_context。书。FromSql($'proc_getbooks {name} ')。to list();//或者使用exec关键字调用存储过程//varbooks=_ context . books . from SQL($ ' exec proc _ getbooks { name } ')。to list();//或者使用SqlParameter实例插入参数。//var param=new sqlparameter()//{//参数名=' @ name ',//sqldbtype=system。data.sqldbtype.nvarchar,//Direction=System。Data.ParameterDirection.Input,//Size=50,//Value=name//};//或者对第一个参数使用@p0,然后对第二个参数使用@p1,依此类推。//varbooks=_ context . books . from SQL(' proc _ getbooks @ P0 ',name)。to list();同样,这里值得一提的是,当我们多次调用同一个存储过程并传递相同的参数时,如下所示:
//使用FromSql多次调用同一个存储过程。var名称=' Cvar list1=_context。books . from SqL($ ' proc _ getbooks { name } ')。to list();var list2=_context。books . from SqL($ ' proc _ getbooks { name } ')。to list();var list3=_context。books . from SqL($ ' proc _ getbooks { name } ')。to list();默认情况下,DbContext将跟踪所有实体(可设置)。如果您执行相同的存储过程,传递相同的参数,并多次执行它,这相当于多次执行相同的sql语句,但返回的结果是相同的。根据DbContext的跟踪,可以直接获取缓存并返回结果。也就是说,存储过程将被多次调用,但数据库只会被检查一次,其他人将获得缓存中的数据。
(3)使用ExecuteSqlCommand调用存储过程,与EF相同。因为需要测试,所以应该创建一个存储过程,因为这个执行查询是没有意义的。如果您查看它的返回,它是int类型的,并且返回的结果都是受影响的行。
看看源代码:
实际上,ExecuteSqlCommand最后调用ExecuteNonQuery,即执行非查询语句并返回受影响的行数,这也验证了我刚才所说的。
太远了,所以创建另一个存储过程
创建过程[dbo]。[proc _ create book]@ name Varchar(50),@author Varchar(50),@ cateid intASBEGIN SET NOCOUNT ON在endgo创建后插入到books ([name],[author],[createtime],[isdel],[cateid])值(@ name,@ author,getdate(),0,@ cateid)中,
请尝试调用以下内容:
//使用ExecuteSqlCommand调用存储过程,也可以使用parameter s 3360 new[]{ }。var name=' c# advanced advanced ';var author='-';var cateid=1;_上下文。database . ExecuteSqlCommand(' proc _ create book @ P0,@p1,@p2 ',名称,作者,cateid);执行结果:
好的,可以成功执行。
在这里,先完成第一部分,再做调用存储过程的扩展,因为光靠这两个调用方法我们是不会满足的!
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。