2012-04-13 100 views
12

過去幾天我在網上找過類似的話題。我終於自己動手問這個問題。實體框架存儲過程結果映射

使用代碼優先方法和EF 4.3.1我創建了上下文類,實體類和類來存儲存儲過程輸出。上下文類具有使用SqlQuery<T>執行某些存儲過程的方法。

例子:

public IEnumerable<Results> GetData(int id) 
{ 
    var parameters = new SqlParameter[] { new SqlParameter("@id", id) }; 
    var result = this.Database.SqlQuery<Result>("Exec dbo.sproc_GetData @id", parameters); 
    var data= result.ToList<Result>(); 

    return data; 
} 

由於我跟蹤我調試我的數據回來,並且數據被映射到具有匹配名稱的屬性。但是,在輸出中有名稱爲"/"的列(例如:Info/Data)。很明顯,所以我想我可以使用列屬性([Column("Info/Data")])輸出映射我不能說出那樣的屬性:

[Column("Info/Data")] 
public string InfoData 
{ 
    get { return infoData; } 
    set { infoData= value; } 
} 

我甚至使用逐字運營商([Column(@"Info/Data")])試圖與[]包裝文本( [Column("[Info/Data]")]),我試了兩次([Column(@"[Info/Data]")])。在遍歷代碼時,我看到具有匹配列名稱的屬性被分配,但具有列屬性的屬性在分配過程中被忽略並且跨越。

我也嘗試過實體的每一列的fluent-api。

modelBuilder.ComplexType<Result>().Property(d => d.InfoData).HasColumnName("Info/Data"); 

但引發以下例外:

數據讀取器是與指定的不相容 'NameSpace.Result'。類型爲'InfoData'的成員在數據讀取器中沒有相應的列,名稱相同。

在我的項目NameSpace.Result是一個類(名保安改變),InfoDatais是屬性,我試圖用流利的API映射(相應的SQL列有/它;例如:信息/數據) 。

有沒有人遇到過這個問題?

如果我的問題不明確,或者有問題,請告訴我。

+7

我想知道什麼樣的人名稱類/數據庫表「/」字符。 – 2012-04-13 22:56:41

+0

這使我們兩個。我沒有寫過程。我被告知要使用這些數據。看到混淆現象是非常令人不安的。 – 2012-04-13 23:35:18

+0

有沒有機會在結果中使用普通列名創建包裝器SP? – vittore 2014-03-23 07:17:49

回答

3

我意識到現在這是一個老問題,但是由於OPs最近的回答已經提到它,所以可能還是有興趣的。

如果您堅持使用該存儲過程,並且它返回的列名與EF不兼容,那麼您可以使用INSERT-EXEC方法來查看您傳遞給SQL以直接調用proc的過程做類似於聲明一個表變量(具有更多兼容的列名),INSERT-EXEC存儲過程到表變量中,然後從表變量中選擇作爲結果集?

這將是一個冗長的SQL傳入,所以我不是一個可口的解決方案,但作爲一個思想練習,看看這是否是解決問題的方法,我想我會提供它。

關於這類問題的好文章:http://www.sommarskog.se/share_data.html - 大多數方法都沒有幫助,因爲您無法更改存儲過程(因此可能幾乎沒有對db結構的訪問或對其進行更改),但INSERT-EXEC方法彈出作爲一種可能的解決方法,而不需要改變分貝級別的任何東西...

+0

我完全忘記了關於Insert-Exec,因爲我只讀過它,從來沒有真正使用它。這是一個比我使用OPENROWSET更好的解決方案。這當然是一個可能的解決方案,因爲它可以讓你掩蓋形成不佳的列名稱。 – 2014-06-12 13:56:26

0

可能無法做到你想要的。使用原始SQL時,EF的映射部分被繞過。

How to use Entity Framework to map results of a stored procedure to entity with differently named parameters

與ExecuteStoreQuery http://social.msdn.microsoft.com/Forums/pl/adonetefx/thread/d524b005-12a4-4300-a974-1e0582de876b

同樣的事情,你可以使用的ObjectQuery獲得DbDataRecord對象的列表。然後使用Linq的「選擇」功能將結果映射到對象類型。如果您將該映射封裝在採用IEnumerable並且返回IEnumberable的擴展函數中。

Return Custom Object <List T> from Entity framework and assign to Object Data Source

+0

我最終離開了代碼優先項目,並在這個例子中與設計師一起去了。它將保持這種方式,直到映射支持來到存儲過程調用。謝謝 – 2012-04-17 14:01:24

0

回去和思考這個問題的最簡單的一個(可能不乾淨或最佳的解決方案)是來包裝整個結果在一個新的程序設置。當然,如果你有能力修改程序而不破壞任何你最好的解決方案。但是,如果您無法修改輸出,則解決方案的一個解決方案是使用OPENROWSET(請參閱Aaron的答案)將過程輸出抓取到表中,並使用新的別名選擇每個列,並遵循更清晰的編程原則。

我希望這可以幫助任何人在未來。

注意:
我還沒有檢查EF的新版本是否已解決此問題。

相關問題