我試圖從實體框架通過以下方式調用存儲過程:調用Context.Database.SqlQuery時獲取從存儲過程的整數結果使用實體框架失敗<int>
Context.Database.SqlQuery<int>(sqlSP, params).FirstOrDefault();
,但我得到這個錯誤:
The data reader has more than one field. Multiple fields are not valid for EDM primitive or enumeration types
隨着LinqPad你可以看到存儲過程的工作
從LinqPad生成的代碼在SQL一樣調用如下
-- Region Parameters
DECLARE @RETURN_VALUE Int
DECLARE @contenttype VarChar(50) = ''
DECLARE @image VarBinary(1000) = null
DECLARE @applicationid Int = 81725
DECLARE @statusid Int = 10
DECLARE @notes VarChar(1000) = ''
DECLARE @requestuserid Int = 59
DECLARE @assigneduserid Int = 655
DECLARE @parentid Int = 0
DECLARE @eventid Int = 0
DECLARE @discipline Int = 5
DECLARE @replyby DateTime = '2017-09-14 16:22:40.082'
DECLARE @workitemid Int = 81725
DECLARE @messagetype Int = 2
DECLARE @inspectionid Int = 6081
DECLARE @floor SmallInt = 3
-- EndRegion
exec @RETURN_VALUE = [dbo].[usp_InsertInspectionEventPublic] @contenttype, @image, @applicationid, @statusid, @notes, @requestuserid, @assigneduserid, @parentid, @eventid, @discipline, @replyby, @workitemid, @messagetype, @inspectionid, @floor
存儲過程始終以下列方式返回ID:
select @id = SCOPE_IDENTITY() from TEMPTABLE
Return @id
我想這太:
var returnCode = new SqlParameter("@ReturnCode", SqlDbType.Int);
returnCode.Direction = ParameterDirection.ReturnValue;
var sql = "exec @ReturnCode =dbo.usp_insertinspectioneventpublic @contenttype, @image, @applicationid, @statusid, @notes, @requestuserid, @assigneduserid, @parentid, @eventid, @discipline, @replyby, @workitemid, @messagetype, @inspectionid, @floor";
var data = Context.Database.SqlQuery<int>(sql, returnCode, inParameters);
var res = data.FirstOrDefault();
return res;
但我得到了另一個錯誤的方法:當執行一個命令,paramerte rs必須是唯一的數據庫參數或值。 這可能是這裏的問題?
返回值與結果集不同。 SqlQuery返回結果集。我不是那麼熟悉,但是你可能能夠從'params'(這是一個關鍵字,所以不使用它)訪問參數'ReturnValue' – Crowcoder