目前,EF對存儲過程的支持並不完善。存在以下問題:
EF不支持存儲過程返回多表聯合查詢的結果集。
EF僅支持返回返回某個表的全部字段,以便轉換成對應的實體。無法支持返回部分字段的情況。
雖然可以正常導入返回標量值的存儲過程,但是卻沒有為我們自動生成相應的實體.cs代碼,我們還是無法在代碼中直接調用或使用標量存儲過程
EF不能直接支持存儲過程中Output類型的參數。
其他一些問題。
今天我們利用EF執行sql語句的方式來執行存儲過程,並得到OutPut的值。
首先新建存儲過程:
Create PROCEDURE proc_testEF
(
@id int,
@voteCount int OUTPUT --返回值
)
AS
BEGIN
SELECT @voteCount = COUNT(*)
FROM ConfirmItem
WHERE ConfirmItemID = @id;
select * from ConfirmItem where ConfirmItemID=@id;
END
然后寫EF調用方法:
using (DBEntities context = new DBEntities())
{
var idParam = new System.Data.SqlClient.SqlParameter
{
ParameterName = "@id",
Value = 1
};
var votesParam = new System.Data.SqlClient.SqlParameter
{
ParameterName = "@voteCount",
Value = 0,
Direction = ParameterDirection.Output
};
var results = context.Database.SqlQuery<Models.ConfirmItem>(
"proc_testEF @id, @voteCount out",
idParam,
votesParam);
var person = results.Single();
var votes = (int)votesParam.Value; //得到OutPut類型值
return votes;
}
測試多次,沒有什么問題;最后我對方法進行封裝:
/// <summary>
/// 執行原始SQL命令
/// </summary>
/// <param name="commandText">SQL命令</param>
/// <param name="parameters">參數</param>
/// <returns>影響的記錄數</returns>
public Object[] ExecuteSqlNonQuery<T>(string commandText, params Object[] parameters)
{
using (DBEntities context = new DBEntities())
{
var results = context.Database.SqlQuery<T>(commandText, parameters);
results.Single();
return parameters;
}
}
調用方式:
var idParam = new System.Data.SqlClient.SqlParameter
{
ParameterName = "@id",
Value = 1
};
var votesParam = new System.Data.SqlClient.SqlParameter
{
ParameterName = "@voteCount",
Value = 0,
Direction = ParameterDirection.Output
};
System.Data.SqlClient.SqlParameter[] parm = {
idParam,
votesParam
};
parm = (System.Data.SqlClient.SqlParameter[])new BLL.Usual.ConfirmItemManager().ExecuteSqlNonQuery<Models.ConfirmItem>("proc_testEF @id, @voteCount out", parm);
string s = parm[1].Value.ToString();
當然還有其它的方式,只是覺得這種簡單方便,比起添加實體模型來說,要方便很多!
