2010-09-29 84 views
5

我正在使用實體框架4與POCO代碼生成器。我有一個存儲過程執行INSERT並返回插入記錄的@@ IDENTITY。我試圖導入存儲過程作爲我的.edmx文件中的函數,但我無法使用它。實體框架4功能導入不工作

在模型瀏覽器中,我可以看到數據庫heirarchy下的存儲過程,然後我右鍵單擊並選擇「Function Import ...」我嘗試使用「無」作爲返回類型以及Int32 (即使它說「收集..」)。該函數出現在函數導入下,但即使在保存和編譯後,我也無法在我的ObjectContext中的任何位置找到函數。我試圖刪除它並重新導入存儲過程幾次,但沒有成功。

注意:我有另一個存儲的過程,執行一個直接的SELECT,這是正確導入並顯示在ObjectContext代碼中。

我做錯了什麼?

回答

5

如果您的存儲過程沒有返回結果集,因此您在Visual Studio的「添加函數導入」對話框中選擇「返回一個集合」「無」,那麼不會將函數導入添加爲方法你生成的對象上下文。 (我還沒有找到爲什麼,但我還在尋找。)

從sproc返回值(例如,返回@@身份)不是什麼意思是「返回一個集合「 題。這就是爲什麼它不起作用。問題是詢問關於從sproc返回的結果集。

有三種方法我能想到的來處理你的問題:

  1. 使用選擇(例如,選擇@@身份識別碼),然後在回覆指定的Int32集合返回你的身份價值到「返回一個集合」的問題。

  2. 返回使用輸出條款您的身份價值的INSERT語句中,並得到同樣的方式在1

  3. 使用實體SQL,使標識值的輸出參數。這裏是如何做到這一點:How to: Execute a Query Using a Stored Procedure with In and Out Parameters

我希望有所幫助。

5

在POCO .Context.tt文件的調查,我發現下面的代碼在周圍線111

if (edmFunction.ReturnParameter == null) 
{ 
    continue; 
} 
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage)); 

這意味着任何函數進口返回「無」將不會被寫入。

使得上述代碼置換爲

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

我已經修改我.Context.tt文件我已經然後不得不添加周圍的函數聲明(圍繞線118)

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

一些檢查和返回聲明(大約在線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()))#>); 
<# 
    } 
#> 

現在,這可能不是最優雅的解決方案(硬編碼字符串!),但它的確意味着我可以在我的存儲過程中使用函數導入,該函數不會返回任何內容,並具有在.Context.cs文件中創建的相應函數,因此可通過Intellisense訪問。

+0

做得很好 - 效果很好! – BrianCooksey 2014-04-01 03:08:01