2013-05-08 61 views
3

當試圖導入存儲過程作爲實體框架5中的函數時,出現以下錯誤。我最近更新了數據項目以引用新版EF。執行函數中的類型參數與函數返回的類型不兼容

在ExecuteFunction來的類型參數「SSDS.Data.testy_Result」是 與類型不兼容「SSDS.Data.testy_Result」由 函數返回。

我無法得到它的任何存儲過程的工作......這是我簡單的測試之一:

CREATE PROCEDURE testy 

AS 
BEGIN 
    select 'hello' as hello 
END 
GO 

它打破上面這裏的例外:

public virtual ObjectResult<testy_Result> testy() 
    { 
     return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<testy_Result>("testy"); 
    } 

並且在模型設計器的「編輯功能導入」窗口中將結果設置爲字符串標量時沒有錯誤。

我打電話這樣的功能:

private Entities db = new Entities(); 
var x = db.testy(); 

有沒有辦法,我在這裏失蹤了一些東西明顯?在我的項目中有幾個edmx文件,其他文件是使用較舊版本的EF創建的(並使用ObjectContext)。

函數映射:

enter image description here

更多函數映射詳細信息:

enter image description here

testy_Result類:

public partial class testy_Result 
    { 
     public string hello { get; set; } 
    } 
+0

嘗試將過程中的值轉換爲varchar或nvarchar – 2013-05-08 14:58:48

+0

檢查導入函數的映射是否與選定的返回類型匹配。在模型資源管理器中,右鍵單擊導入的函數並選擇「函數導入映射」。確保左邊的屬性與右邊的字段匹配 – James 2013-05-08 17:47:25

+0

@RuiJarimba在proc中強制轉換does not幫助 – woggles 2013-05-09 14:25:46

回答

0

我不知道這是否會有所幫助,但在這裏是我創造的erally做:

假設你從實體框架有以下POCO類:

using System; 

public partial class testy_Result 
{ 
    public string hello { get; set; } 
} 

以下調用通常的伎倆對我來說:

public partial class Entities: DbContext 
{ 

    public virtual ObjectResult<testy_Result> testy() 
    { 
     ((IObjectContextAdapter)this).ObjectContext.MetadataWorkspace.LoadFromAssembly(typeof(testy_Result).Assembly); 

     return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<testy_Result> 
      ("testy", MergeOption.OverwriteChanges); 
    } 
} 

此外,爲了以防萬一,我把我的電話打包在using子句中:

 try 
     { 
      using (Models.Data.Entities Entities = new Models.Data.Entities()) 
      { 
       var x = Entities.testy().FirstOrDefault().hello; 
      } 
     } 
     catch (Exception ex) 
     { 
      System.Diagnostics.Debug.WriteLine("Error: " + ex.Message); 
     } 

讓我知道它是否適用於您。

乾杯。

2

過去幾天我一直在努力解決這個問題。我的項目也從以前版本的實體框架升級到5.0。我終於明白這是由於新舊edmxs的混合。刪除舊的edmx允許新的工作,但當然這不是一個可行的解決方案。我還能夠通過將新(EF 5)edmx的代碼生成策略更改爲「Legacy ObjectContext」來實現它。如果您不熟悉,可以通過打開edmx圖,右鍵單擊並轉至「屬性」來找到。我懷疑項目中的所有edmxs只需要使用相同的代碼生成策略,所以您可能也可以將舊的改爲T4,儘管這可能會涉及更多工作。