我正在使用带有POCO代码生成器的Entity Framework 4。我有一个存储过程,它执行INSERT并返回插入记录的@@ IDENTITY。我试图将存储过程作为函数导入我的.edmx文件中,但我无法使用它。
在模型浏览器中,我可以看到数据库层次结构下的存储过程,然后右键单击并选择“函数导入...”我尝试使用“无”作为返回类型以及Int32(即使它说“收集...”)。该函数出现在Function Imports下,但即使在保存和编译之后,我也无法在ObjectContext中的任何位置找到该函数。我试图删除它并多次重新导入存储过程但没有成功。
注意:我有另一个存储过程执行直接SELECT,这是正确导入并显示在ObjectContext代码中。
我做错了吗?
答案 0 :(得分:5)
如果存储过程未返回结果集,则在Visual Studio的“添加函数导入”对话框中选择“返回”“无”的集合,则不会将函数导入作为方法添加到您的生成对象上下文。 (我还没找到原因,但我还在寻找。)
来自sproc的返回值(例如,返回@@ identity)不是“返回集合”问题的含义。这就是为什么它不起作用。问题是询问从sproc返回的结果集。
我可以通过三种方式来解决您的问题:
使用select返回您的身份值(例如,选择@@ identity作为Identity),然后指定Int32的集合以回复“返回”问题的集合。
使用insert语句中的output子句返回您的标识值,并以与1中相同的方式获取它。
使用Entity SQL并将标识值设为out参数。以下是如何执行此操作:How to: Execute a Query Using a Stored Procedure with In and Out Parameters
我希望有所帮助。
答案 1 :(得分:5)
在调查POCO .Context.tt
文件时,我在111行附近找到了以下代码
if (edmFunction.ReturnParameter == null)
{
continue;
}
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
表示不会写入任何返回'none'的函数导入。
我修改了.Context.tt
文件,以便上面的代码替换为
string returnTypeElement = @"";
if (edmFunction.ReturnParameter == null)
{
returnTypeElement = @"void";
} else {
returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
}
然后我必须在函数声明周围添加一些检查(第118行)
<#
if(returnTypeElement != "void"){
#>
<#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>> <#=code.Escape(edmFunction)#>(<#=paramList#>)
<#
} else {
#>
<#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeElement#> <#=code.Escape(edmFunction)#>(<#=paramList#>)
<#
}
#>
和return语句(第142行)
<#
if(returnTypeElement != "void"){
#>
return base.ExecuteFunction<<#=returnTypeElement#>>("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>);
<#
} else {
#>
base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>);
<#
}
#>
现在,这可能不是最优雅的解决方案(硬编码字符串!),但它确实意味着我可以在我的存储过程上使用函数import,它不会返回任何内容并且在{{1中创建了相应的函数文件,因此可以通过Intellisense访问。