2011-10-12 97 views
1

我试图在我的Entity Framaework 4中使用存储过程。如何从实体框架调用没有返回数据的存储过程?

我已经创建了实体模型,并可以在Stored Procedure文件夹中的模型浏览器中看到存储的过程。

我通过功能导入添加了存储过程。我存储的proc没有返回类型。现在,当我试图在对象上下文(业务层)中调用存储过程时,我无法在智能中看到存储的过程。我在做什么错误?

注:如果他们有返回值,我可以看到其他过程。在这种特殊情况下,没有任何返回值

回答

2

由于某种原因,POCO生成模板会忽略没有返回类型的函数导入。我真的不知道他们为什么这样做,但可以通过更改模板来修复它。我记得在我放弃整个EF-POCO之前,我也这样做了。你使用EF的POCO?要解决这个问题,你必须打开.tt模板文件。基本上我只是复制正常功能导入的循环,并稍微改变了它。我加入了

foreach (EdmFunction edmFunction in container.FunctionImports) 
{ 
    var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef); 
    string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray()); 
    if (edmFunction.ReturnParameter != null) 
    { 
     continue; 
    } 

#> 
<#=Accessibility.ForMethod(edmFunction)#> void <#=code.Escape(edmFunction)#>(<#=paramList#>) 
{ 
<# 
    foreach (var parameter in parameters) 
    { 
     if (!parameter.NeedsLocalVariable) 
     { 
      continue; 
     } 
#> 

    ObjectParameter <#=parameter.LocalVariableName#>; 

    if (<#=parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"#>) 
    { 
     <#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", <#=parameter.FunctionParameterName#>); 
    } 
    else 
    { 
     <#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", typeof(<#=parameter.RawClrTypeName#>)); 
    } 
<# 
    } 
#> 
    base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>); 
} 
<# 
} 

您可以找到相关的Q/A在这里:FunctionImport in entity framework 4 issue

0

您需要将程序映射到更新读取或删除操作,否则在映射它时没有意义。另一种方法是直接在上下文中执行它。

相关问题