实体框架4功能导入无效

dot*_*iel 5 stored-procedures entity-framework-4

我正在使用实体框架4和POCO代码生成器.我有一个存储过程,它执行INSERT并返回插入记录的@@ IDENTITY.我想导入的存储过程在我的.edmx文件中的函数,但我使用它遇到了问题.

在模型浏览器中,我可以看到数据库层次结构下的存储过程,然后我右键单击并选择"函数导入..."我尝试使用"无"作为返回类型以及Int32(即使它说"收集...").该功能将显示在功能的进口,但即使保存和编译后,我无法找到任何地方的功能在我的ObjectContext.我试图删除它并多次重新导入存储过程但没有成功.

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

难道我做错了什么?

gra*_*esd 5

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

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

我可以通过三种方式来处理您的问题:

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

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

  3. 使用Entity SQL并将标识值设为out参数.以下是如何执行此操作:如何:使用带有输入和输出参数的存储过程执行查询

我希望有所帮助.


Mar*_*son 5

在调查POCO .Context.tt文件时,我在第111行附近找到了以下代码

if (edmFunction.ReturnParameter == null)
{
    continue;
}
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
Run Code Online (Sandbox Code Playgroud)

这意味着任何返回'none'的函数都不会被写入.

我修改了我的.Context.tt文件,以便替换上面的代码

string returnTypeElement = @"";
if (edmFunction.ReturnParameter == null)
{
    returnTypeElement = @"void";
} else {
    returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
}
Run Code Online (Sandbox Code Playgroud)

然后,我必须在函数声明周围添加一些检查(在第118行附近)

<#
    if(returnTypeElement != "void"){
#>
    <#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>>   <#=code.Escape(edmFunction)#>(<#=paramList#>)
<#  
    } else {
#>
    <#=Accessibility.ForMethod(edmFunction)#> <#=returnTypeElement#> <#=code.Escape(edmFunction)#>(<#=paramList#>)
<#  
    } 
#>
Run Code Online (Sandbox Code Playgroud)

和返回声明(第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()))#>);
<#  
    } 
#>  
Run Code Online (Sandbox Code Playgroud)

现在,这可能不是最优雅的解决方案(硬编码字符串!),但它确实意味着我可以在我的存储过程中使用函数import,它不返回任何内容并在.Context.cs文件中创建相应的函数,因此可以通过智能感知.