[英]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.