实体框架4功能导入无效

时间:2010-09-29 20:04:49

标签: stored-procedures entity-framework-4

我正在使用带有POCO代码生成器的Entity Framework 4。我有一个存储过程,它执行INSERT并返回插入记录的@@ IDENTITY。我试图将存储过程作为函数导入我的.edmx文件中,但我无法使用它。

在模型浏览器中,我可以看到数据库层次结构下的存储过程,然后右键单击并选择“函数导入...”我尝试使用“无”作为返回类型以及Int32(即使它说“收集...”)。该函数出现在Function Imports下,但即使在保存和编译之后,我也无法在ObjectContext中的任何位置找到该函数。我试图删除它并多次重新导入存储过程但没有成功。

注意:我有另一个存储过程执行直接SELECT,这是正确导入并显示在ObjectContext代码中。

我做错了吗?

2 个答案:

答案 0 :(得分:5)

如果存储过程未返回结果集,则在Visual Studio的“添加函数导入”对话框中选择“返回”“无”的集合,则不会将函数导入作为方法添加到您的生成对象上下文。 (我还没找到原因,但我还在寻找。)

来自sproc的返回值(例如,返回@@ identity)不是“返回集合”问题的含义。这就是为什么它不起作用。问题是询问从sproc返回的结果集。

我可以通过三种方式来解决您的问题:

  1. 使用select返回您的身份值(例如,选择@@ identity作为Identity),然后指定Int32的集合以回复“返回”问题的集合。

  2. 使用insert语句中的output子句返回您的标识值,并以与1中相同的方式获取它。

  3. 使用Entity SQL并将标识值设为out参数。以下是如何执行此操作:How to: Execute a Query Using a Stored Procedure with In and Out Parameters

  4. 我希望有所帮助。

答案 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访问。