Stored procedures 实体框架4功能导入不工作

Stored procedures 实体框架4功能导入不工作,stored-procedures,entity-framework-4,Stored Procedures,Entity Framework 4,我正在使用实体框架4和POCO代码生成器。我有一个执行插入并返回插入记录的@标识的存储过程。我试图将存储过程作为函数导入.edmx文件,但在使用时遇到问题 在模型浏览器中,我可以看到数据库继承者权限下的存储过程,然后右键单击并选择函数导入。。。我已经尝试过使用None作为返回类型以及Int32,尽管它说的是。。。该函数出现在函数导入下,但即使在保存和编译后,我也无法在ObjectContext中的任何位置找到该函数。我多次尝试删除它并重新导入存储过程,但都没有成功 注意:我有另一个直接选择的存储

我正在使用实体框架4和POCO代码生成器。我有一个执行插入并返回插入记录的@标识的存储过程。我试图将存储过程作为函数导入.edmx文件,但在使用时遇到问题

在模型浏览器中,我可以看到数据库继承者权限下的存储过程,然后右键单击并选择函数导入。。。我已经尝试过使用None作为返回类型以及Int32,尽管它说的是。。。该函数出现在函数导入下,但即使在保存和编译后,我也无法在ObjectContext中的任何位置找到该函数。我多次尝试删除它并重新导入存储过程,但都没有成功

注意:我有另一个直接选择的存储过程,它被正确导入并显示在ObjectContext代码中


我做错了吗?

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

存储过程的返回值(例如return@@identity)不是返回问题集合的意思。这就是它不起作用的原因。现在的问题是,存储过程返回了什么样的结果集

我可以想出三种方法来处理您的问题:

使用select返回您的标识值,例如,选择@@identity作为标识,然后指定Int32的集合作为对返回问题集合的答复

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

使用实体SQL并将标识值设置为out参数。以下是如何做到这一点:


我希望这会有所帮助。

在调查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#>)
<#  
    } 
#>
第142行的return语句

<#
    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()))#>);
<#  
    } 
#>  
现在,这可能不是硬编码字符串最优雅的解决方案!,但这确实意味着我可以在不返回任何内容的存储过程中使用函数导入,并在.Context.cs文件中创建相应的函数,因此可以通过Intellisense进行访问