我有一个存储过程返回一个值,而不是一个数据集,我在使用EF4时遇到了问题。
我见过这个:http://dotnet.dzone.com/news/how-retrieve-stored-procedure
这就是我所做的:我在模型中添加了一个过程,并导入了一个函数。
我遇到的第一个问题是我的程序中的参数被命名为@_Parameter_in
。这使得EF将它们作为p_Parameter_in
引入,因为它不能用下划线作为第一个字符。然后当我调用存储过程时,我可以在SQL Profiler调用中看到它查找@p_Parameter_in
,当然还有一个问题。
现在我重命名参数并查看SQL Trace - 一切看起来都很棒。问题是我无法获得价值。以下是我的代码的外观:
System.Data.Objects.ObjectParameter newKey = new System.Data.Objects.ObjectParameter("NewKey_out", typeof(Int32));
newKey.Value = 0;
context.GetNextSurrogateKey_v2("tTest", newKey);
调用newKey.Value
后,它始终为0或我设置的任何值。它没有带来价值。我怀疑我的问题是我如何导入该功能。我使用标量和数据类型Int32
。出于某种原因,我禁用了“创建新的复杂类型”。有人有这个问题吗?
答案 0 :(得分:7)
我在这里猜测,因为我看不到你正在调用的存储过程。我想你想要检索存储过程返回的标量值,而不是存储过程中定义的输出参数的值。
我相信您想在EDM中定义一个新函数并将其指向存储过程。快速谷歌有这个潜在的解决方案:http://www.devtoolshed.com/using-stored-procedures-entity-framework-scalar-return-values
HTH
答案 1 :(得分:2)
问题是datareader结束读取后的EF过程输出参数。这通常是在调用DataBind()函数之后。 我有更长的处理程序同样的问题。我通过在ObjectResult上使用.ToList()函数来解决这个问题。
var rowsCount = new ObjectParameter("RowsCount", typeof(Int32));
var result = db.GetProductList(pageSize, pageNumber, rowsCount).ToList();
this.ProductsCount = (int?)rowsCount.Value;
您可以使用FirstOrDefault()函数解决单行或值。
答案 2 :(得分:0)
我和Jan Remunda描述的问题一样。有人将返回类型从Integer更改为Entity.Core.Objects.ObjectResult(Integer?),导致始终不返回任何内容。
对于我们来说,解决方案是强制EF通过将.FirstOrDefault()函数添加到返回来读取存储过程的返回。