11

有誰知道是否可以使用代碼優先的實體框架中使用TVF?具體來說:使用代碼優先的實體框架中的TVF(表值函數)

我知道這是不支持代碼優先目前(它看起來不像EF6將允許它)。另一方面,更高版本的EF在數據庫優先場景中支持TVF(這對我來說不是一種選擇)。我想知道是否有人知道是否有某種方法通過操作模型或類似的東西來模擬數據庫首先執行的操作?

一個進一步的說明;我知道可以通過使用SQL來包含TVF,但我也需要TVF是可組合的(即成爲實體LINQ語句的一部分)。

+0

在EF6中,一個非常冒險的解決方法是使用攔截器將實體的表名重寫爲TVF調用。我做了一個[示例實現](https://gist.github.com/sinelaw/9084984)。 **不推薦!** – sinelaw

+0

可能重複[如何在實體框架代碼第一種方法中使用表值函數?](http://stackoverflow.com/questions/16769299/how-to-use-table-valued-function -in-entity-framework-code-first-approach) – magnattic

+0

現在可以使用EF6.1和我創建的自定義約定。看看下面的答案。 – Pawel

回答

8

這現在是可能的。我創建了一個自定義模型約定,允許在EF6.1中使用CodeFirst中的存儲函數。該公約可在NuGet http://www.nuget.org/packages/EntityFramework.CodeFirstStoreFunctions上找到。這裏是包含所有細節的博客帖子的鏈接:http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

+0

令人敬畏的工作Pawel!我今天早些時候讀過你的博客。我期待下次嘗試拋棄edmx文件時嘗試一下。 –

+0

謝謝!希望它會爲你工作! – Pawel

-3

可以在實體框架5.I使用Table-Valued Function認爲link將解決你的問題:

對於實體框架使用表值函數,你需要做以下步驟:

在解決方案資源管理器中右鍵單擊項目名稱,指向添加,然後單擊新建
項目。

2.選擇從左側菜單中的數據,然後在 模板窗格中選擇ADO.NET實體數據模型。

3.輸入TVFModel.edmx作爲文件名,然後單擊添加。

4.在Choose Model Contents對話框中,選擇Generate from database,然後點擊Next。

5.單擊新建連接 在服務器名稱文本框中輸入 輸入(localdb)\v11.0學校數據庫名稱 單擊確定。

6.在選擇數據庫對象對話框中,在表節點下,選擇
人,StudentGrade和課程表。

7.選擇位於存儲過程 和功能節點注意下GetStudentGradesForCourse功能,即開始與Visual Studio 2012,實體設計
允許你批量導入您的存儲過程和函數。

8.單擊完成。

實體設計,它提供了一個設計,表面爲編輯模式,是顯示
。您在選擇數據庫對象
對話框中選擇的所有對象都將添加到模型中。

10。默認情況下,每個導入的存儲過程或函數的結果形狀
會自動成爲實體模型中的新複合類型。但是,我們要映射 的的GetStudentGradesForCourse功能的StudentGrade實體的結果: 右鍵單擊設計圖面,然後選擇模型瀏覽器 在模型瀏覽器中,選擇函數導入,然後雙擊
GetStudentGradesForCourse功能 在編輯功能導入對話框中,選擇實體和選擇StudentGrade

您可以使用下面的代碼在應用程序中使用Table-Value Function檢索數據:

using (var context = new SchoolEntities()) 
{ 
    var CourseID = 4022; 
    var Grade = 3.5M; 

    // Return all the best students in the Microeconomics class. 
    var students = from s in context.GetStudentGradesForCourse(CourseID) 
          where s.Grade >= Grade 
          select new 
          { 
           s.Person, 
           s.Course.Title 
          }; 

    foreach (var result in students) 
    { 
     Console.WriteLine(
      "Couse: {0}, Student: {1} {2}", 
      result.Title, 
      result.Person.FirstName, 
      result.Person.LastName); 
    } 
} 
+0

Vaibhav,他在問「代碼第一支持」。 .edmx文件是「數據庫第一」。 –

1

目前可能的是而不是。它被推遲到EF6之後。最好的辦法是在用戶語音板上投票。該功能建議標題爲「Code First support for Table-Valued Functions」。我只投了3票。

+0

現在可以了 - 請參閱我的答案。 – Pawel