实体框架核心使用存储过程删除带有bool返回的实体

时间:2020-09-03 15:21:24

标签: c# sql-server asp.net-core

我有一个实体,只需将其称为“实体”,即可通过存储过程将其删除。 “实体”实体相对复杂,具有许多相关的实体-因此,为什么我要使用存储过程删除该实体。

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值。

2 个答案:

答案 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;