我正在使用实体框架和azure用于db。事实是当EF不从模型返回字段时,EF对存储过程的效果不佳。 model.Context.cs文件中自动生成的代码返回整数。
public virtual int GetLogTransaction(Nullable<long> transactionId)
{
var transactionIdParameter = transactionId.HasValue ?
new ObjectParameter("transactionId", transactionId) :
new ObjectParameter("transactionId", typeof(long));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("IHUBEntities.GetLogTransaction", transactionIdParameter);
}
所以我决定避开这个文件并使用EntityCommand连接到db并执行我的程序。
EntityConnection sqlConnection = new EntityConnection("name=IHUBEntities");
sqlConnection.Open();
using ( EntityCommand cmd = sqlConnection.CreateCommand())
{
LogTransactionInfor lgInfor = new LogTransactionInfor();
try
{
cmd.CommandText = "IHUBEntities.GetLogTransaction";
cmd.CommandType = CommandType.StoredProcedure;
EntityParameter param = new EntityParameter();
param.Value = transactionId;
param.ParameterName = "transactionId";
cmd.Parameters.Add(param);
using (EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
while (reader.Read())
{
//get reader content here
}
}
cmd.Connection.Close();
}catch (Exception ex)
{
lgInfor.err = ex.StackTrace;
Console.Write(ex.StackTrace);
cmd.Connection.Close();
}
finally
{
cmd.Dispose();
}
return lgInfor;
}
问题是读者总是空着,给我零结果。但是,当我使用相同的输入参数来测试db sql时,它将返回所需的结果。 所以,我认为问题可能是因为我编写程序的方式?
CREATE PROCEDURE [dbo].[GetLogTransaction]
@transactionId bigint = 0
AS
DECLARE
@tablename nvarchar(261),
@obj_name nvarchar(4000),
@pk bigint,
@pk_name nvarchar(500),
@opt nvarchar(20),
@usrId bigint,
@usrName nvarchar(200),
@sql nvarchar(4000),
@cn int
DECLARE
@userTable table(
usrId bigint,
usrName nvarchar(200)
)
BEGIN
//select from different tables and set values to parameters
......
select @obj_name as obj_name, @pk as pk, @pk_name as pk_name, @opt as opt, @usrId as usrId, @usrName as usrName
END
答案 0 :(得分:0)
我假设你正在使用'数据库优先'。
您是否正确设置了存储过程的返回类型?
抱歉,我有点新,所以我不确定如何上传图片,但是:
1)打开.EDMX文件
2)在模型浏览器中,找到“功能导入”
3)双击存储过程。
4)单击“获取列信息”
5)单击“更新”
6)完成!
如果存储过程没有出现在“函数导入”中,则需要从数据库中更新模型。