2011-04-02 101 views
8

我使用的是實體框架4.1 RC和代碼優先的方法。 如何調用自定義SQL函數?自定義SQL函數和代碼優先(EF 4.1)

如果我使用EdmFunction屬性,我應該指定哪個名稱空間?

[EdmFunction("Namespace", "GetAge")] 
public static int GetAge(Person p) 
{ 
    throw new NotSupportedException(…); 
} 

當我嘗試執行與這樣的功能LINQ查詢以下異常被拋出:

指定的方法「...」的類型 「...」不能被翻譯進入LINQ到 實體存儲表達式。

回答

8

如果要調用SQL函數,則必須執行自定義SQL查詢。要做到這一點使用context.Database.SqlQuery。實體框架支持存儲過程映射,但此功能在DbContext API(EF 4.1)中不受支持。如果你想調用一個存儲過程,你必須再次使用context.Database.SqlQuery。存儲過程不能在Linq查詢中使用。

EdmFunction是ObjectContext API和實體設計器的特性。命名空間被設置爲在EDMX文件中定義的命名空間。首先使用代碼時,您沒有EDMX文件,並且無法定義函數映射。

Btw。如果您遵循代碼優先的方法,您不應該有任何存儲過程或SQL函數,因爲您的數據庫是由您的模型(代碼)定義並由實體框架生成的。

+11

嗯......多麼糟糕的限制。代碼首先比EDMX模型清潔得多,但他們沒有在這兩個模塊中實現這些功能是一種遺憾。他們讓你指定自定義數據庫初始化代碼,所以即使將代碼放在第一個模型的頭腦中,包含它也是有意義的。嘆息... – Ocelot20 2012-06-29 19:22:42

+0

最後,2年後,可以這樣做:您可以使用Code First的EDM。我添加了一個鏈接到一個不完整的TVF和SP映射實現的答案。 – JotaBe 2014-06-11 15:41:37

3

從EF 6.1開始,現在可以映射函數了,因爲現在可以從Code First訪問EDM。

下面是一個實現的示例,它允許映射TVF和存儲過程,但有一些限制。它也使用EF 6自定義約定。

但願會有很快更完整的解決方案:

https://codefirstfunctions.codeplex.com/

注:還可以使用Git將代碼複製到你的機器和修改/改進

1

我的成功這個看這個項目https://github.com/divega/UdfCodeFirstSample

+0

這很好用 – 2016-07-26 16:14:36

+0

您可以擴展您的答案以添加元數據如何工作的詳細信息嗎? – 2016-07-26 19:31:27