dot*_*iel 5 stored-procedures entity-framework-4
我正在使用实体框架4和POCO代码生成器.我有一个存储过程,它执行INSERT并返回插入记录的@@ IDENTITY.我想导入的存储过程在我的.edmx文件中的函数,但我使用它遇到了问题.
在模型浏览器中,我可以看到数据库层次结构下的存储过程,然后我右键单击并选择"函数导入..."我尝试使用"无"作为返回类型以及Int32(即使它说"收集...").该功能将显示在功能的进口,但即使保存和编译后,我无法找到任何地方的功能在我的ObjectContext.我试图删除它并多次重新导入存储过程但没有成功.
注意:我有另一个存储过程执行直接SELECT,这是正确导入并显示在ObjectContext代码中.
难道我做错了什么?
如果存储过程未返回结果集,则在Visual Studio的"添加函数导入"对话框中选择"返回""无"的集合,则不会将函数导入作为生成的对象上下文的方法添加.(我还没找到原因,但我还在寻找.)
来自sproc的返回值(例如,返回@@ identity)不是"返回集合"问题的含义.这就是为什么它不起作用.问题是询问从sproc返回的结果集.
我可以通过三种方式来处理您的问题:
使用select返回您的身份值(例如,选择@@ identity作为Identity),然后指定Int32的集合以回复"返回一个问题的集合".
使用insert语句中的output子句返回您的标识值,并以与1中相同的方式获取它.
使用Entity SQL并将标识值设为out参数.以下是如何执行此操作:如何:使用带有输入和输出参数的存储过程执行查询
我希望有所帮助.
在调查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
文件中创建相应的函数,因此可以通过智能感知.
归档时间: |
|
查看次数: |
8628 次 |
最近记录: |