簡體   English   中英

Entity Framework Core 使用存儲過程刪除帶有 bool 返回值的實體

[英]Entity Framework Core using stored procedure to delete entity with bool return

我有一個實體,我們稱之為“實體”,我想用存儲過程刪除它。 “實體”實體相對復雜,有很多相關實體 - 因此,我想使用存儲過程來刪除實體。

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 不知道它應該期望什么數據類型。 據我TEntity ,Entity Framework Core 只接受TEntity類型。 所以我的問題實際上是,我如何使用 Entity Framework Core 調用存儲過程,以便我可以傳遞一個 Id 並返回一個 bool 值。

而在您的情況下,您可以在您的程序中簡單地使用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;

在 try catch 中調用您的存儲過程並添加您想要傳遞給 sp 的 SqlParameter,如下所示:

 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;
    }

通過這種方式,如果 sp 的執行發生錯誤,它將捕獲並返回 false,否則返回 true。
注意:如果您在存儲過程中聲明raiseerror ,您可以生成一條錯誤消息並將其發送到您的應用程序 try catch。 有關 raiseerror 的更多詳細信息: https ://docs.microsoft.com/en-us/sql/t-sql/language-elements/raiserror-transact-sql ? view = sql-server-ver15

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM