我有一个实体,只需将其称为“实体”,即可通过存储过程将其删除。 “实体”实体相对复杂,具有许多相关的实体-因此,为什么我要使用存储过程删除该实体。
CREATE PROCEDURE dbo.spDeleteEntity
@EntityId int,
@ServiceResult bit output
AS
BEGIN
.... Delete logic here ...
IF @@ERROR = 0
SET @ServiceResult = 1
ELSE SET @ServiceResult = 0
END
如您所见,存储过程为实体输入EntityId
,执行我的删除逻辑,并返回一点-在这种情况下为我的ServiceResult
。如果执行查询时没有错误发生,则ServiceResult
为“ True” / 1,如果发生错误则为“ False” / 0。现在的问题是,我希望能够从.NET Core执行此存储过程。我最初的想法是做这样的事情
public bool DeleteEntity(Entity Entity)
{
return _context.Entity.FromSqlRaw<bool>("spDeleteEntity {0}", Entity.Id);
}
我相信这是行不通的,因为Entity Framework Core不知道它应该期望什么数据类型。据我所知,Entity Framework Core仅接受TEntity
类型。所以我的问题确实是,如何使用Entity Framework Core调用存储过程,以便我可以传递一个ID并获取返回的bool值。
答案 0 :(得分:0)
在try catch中调用您的存储过程,并添加要传递给sp的SqlParameter,如下所示:
arr = [[10, 0], [3, 5], [5, 8]]
p arr.sum{|on, off| on - off} # => 5
这样,如果sp的执行发生错误,它将捕获并返回false,否则返回true。
注意:如果您在存储过程中声明了 try
{
using(var context = new SampleContext())
{
//Declare storedprocedure parameter
var Idp = new SqlParameter("@IdParam", "Idp");
//Call stored procedure(For async call use ExecuteSqlCommandAsync method)
context.Database.ExecuteSqlCommand("EXEC spName @IdParam", Idp);
}
Return true:
}
catch
{
Return false;
}
,则可能会生成错误消息并将其发送到您的应用程序try catch。
有关raiseerror的更多详细信息:
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql?view=sql-server-ver15
答案 1 :(得分:0)
在您的情况下,您只需在过程中RAISERROR
即可指示失败。
try{
_context.Database.ExecuteSqlInterpolatedAsync($"spDeleteEntity {Entity.Id}");
return true;
}catch(...){
return false;
}
有一种方法可以使用EF Core将SQL参数传入/传出原始sql命令;
var entityId = new SqlParameter("@entityId", Entity.Id);
var result = new SqlParameter("@result", SqlDbType.Bit)
{ Direction = ParameterDirection.Output };
_context.Database.ExecuteSqlRaw("EXEC @result = spDeleteEntity @entityId", entityId, result);
return (bool)result.Value;