2011-10-12 95 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

您需要將程序映射到更新讀取或刪除操作,否則在映射它時沒有意義。另一種方法是直接在上下文中執行它。

相關問題