共用方式為


逐步解說:從 EDMX 結構描述檔案產生 F# 型別 (F#)

F# 3.0 的這個逐步解說顯示如何針對 Entity Data Model (EDM) 這種在 .edmx 檔案中指定的結構描述所表示的資料創建型別。這個逐步解說也將示範如何使用 EdmxFile 類型的提供者。在您開始之前,請考慮 SqlEntityConnection 型別提供者是否為更適當的型別提供者選項。如果您擁有在專案開發階段可連接的線上資料庫並且不介意在編譯時期指定連接字串,則 SqlEntityConnection 型別提供者是最適合的選擇對象。不過,這種型別提供者也存在限制而無法公開 與EdmxFile 型別提供者所能提供數量相同的資料庫功能。此外,如果您沒有線上資料庫用於使用實體資料模型的資料庫專案,您可以使用 .edmx 檔案對資料庫進行編碼。當您使用 EdmxFile 型別提供者時, F# 編譯器執行 EdmGen.exe 生成它所提供的型別。

這個逐步解說將說明下列工作,您必須按照這個逐步解說中說明的順序執行才會成功:

  • 建立 EDMX 檔案

  • 建立專案

  • 尋找或建立實體資料模型中的連接字串

  • 設定型別提供者

  • 查詢資料。

  • 呼叫預存程序

建立 EDMX 檔案

如果您已經有 EDMX 檔案,就可以略過此步驟。

若要建立 EDMX 檔

  • 如果您還沒有 EDMX 檔案,您可以遵循 ADO.NET Entity Framework Quickstart 的指示建立實體資料模型和 EDMX 檔案的資料庫。或者,您可以參閱指令在步驟 設定實體資料模型之逐步解說最後的一節。

建立專案

在這個步驟中,您會建立專案並且在其中加入適當的參考給使用 EDMX 型別的提供者。

建立並設定此專案

  1. 結束先前專案,建立另一個專案,並命名為 SchoolEDM。

  2. 在 [方案總管] 中按一下 [參考],然後在捷徑功能表中按一下 [加入參考]。

  3. 在這些組件區中,請選擇架構端。

  4. 在可用的組件清單中,選取 System.Data.EntitySystem.Data.Linq 組件,然後選取 [加入] 按鈕加入下列組件的參考加入至專案。

  5. 在這些組件區中,請選擇延伸端。

  6. 在可用的副檔名清單,請在 FSharp.Data.TypeProviders 組件中加入參考。

  7. 加入下列程式碼會開啟適當的命名空間。

    open System.Data.Linq
    open System.Data.Entity
    open Microsoft.FSharp.Data.TypeProviders
    

尋找或建立實體資料模型中的連接字串

實體資料模型的 EDMX 連接字串 (Connection String) 不只包括資料庫提供者的連接字串,還包含其他資訊。例如, EDMX 簡單的 SQL Server 資料庫的連接字串類似下列程式碼。

let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"

如需 EDMX 連接字串的詳細資訊,請參閱 Connection Strings

尋找或建立實體資料模型中的連接字串

  • EDMX 連接字串可能會很難手動產生,因此,您可以以程式設計的方式設定屬性來節省時間。如果您知道 EDMX 連接字串,您可以略過此步驟和並在下一個步驟使用該字串。否則,請使用下列程式碼從您所提供的資料庫中產生 EDMX 連接字串。

    open System
    open System.Data
    open System.Data.SqlClient
    open System.Data.EntityClient
    open System.Data.Metadata.Edm
    
    let getEDMConnectionString(dbConnectionString) =
        let dbConnection = new SqlConnection(connectionString)
        let resourceArray = [| "res://*/" |]
        let assemblyList = [| System.Reflection.Assembly.GetCallingAssembly() |]
        let metaData = MetadataWorkspace(resourceArray, assemblyList)
        new EntityConnection(metaData, dbConnection)
    

設定型別提供者

在這個步驟中,您將建立並設定 EDMX 連接字串型別的提供者,然後,您會在 .edmx 檔案中定義中產生結構描述的型別。

設定型別提供者和產生型別

  1. 複製您在第一個步驟中會產生這個逐步解說至專案資料夾的 .edmx 檔案。

  2. 在您的 F# 專案中開啟捷徑功能表,選擇Add Existing Item,然後再選擇 .edmx檔加入您的專案中。

  3. 輸入下列程式碼來啟動 .edmx 檔案類型的提供者。在執行 SQL Server 和執行個體名稱伺服器名稱中取代 伺服器\執行個體 ,並使用從第一個步驟中的 .edmx 檔案的名稱。

    type edmx = EdmxFile<"Model1.edmx", ResolutionFolder = @"<folder that contains your .edmx file>>
    
    let edmConnectionString =
        getEDMConnectionString("Data Source=SERVER\instance;Initial Catalog=School;Integrated Security=true;")
    let context = new edmx.SchoolModel.SchoolEntities(edmConnectionString)
    

查詢資料。

在這個步驟中,您使用 F# 查詢運算式查詢資料庫。

查詢資料。

  • 輸入下列程式碼會查詢在實體資料模型中的資料。

    query { for course in context.Courses do
            select course }
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    query { for person in context.Person do
            select person }
    |> Seq.iter (fun person -> printfn "%s %s" person.FirstName person.LastName)
    
    // Add a where clause to filter results
    query { for course in context.Courses do
            where (course.DepartmentID = 1)
            select course)
    |> Seq.iter (fun course -> printfn "%s" course.Title)
    
    // Join two tables
    query { for course in context.Courses do
            join (for dept in context.Departments -> course.DepartmentID = dept.DepartmentID)
            select (course, dept.Name) }
    |> Seq.iter (fun (course, deptName) -> printfn "%s %s" course.Title deptName)
    

呼叫預存程序

您可以使用 EDMX 型別的提供者呼叫預存程序。在下列程序中, School 資料庫含有一個預存程序, UpdatePerson,更新的資料列將該資料行的新值。您可以使用這個預存程序,因為它會公開為在 DataContext 型別的方法。

預存程序呼叫

  • 將下列程式碼加入以更新資料錄。

    // Call a stored procedure.
    let nullable value = new System.Nullable<_>(value)
    
    // Assume now that you must correct someone's hire date.
    // Throw an exception if more than one matching person is found.
    let changeHireDate(lastName, firstName, hireDate) =
    
        query { for person in context.People do
                where (person.LastName = lastName &&
                       person.FirstName = firstName)
                exactlyOne }
        |> (fun person ->
                context.UpdatePerson(nullable person.PersonID, person.LastName,
                    person.FirstName, nullable hireDate, person.EnrollmentDate))
    
    changeHireDate("Abercrombie", "Kim", DateTime.Parse("1/12/1998"))
    |> printfn "Result: %d"
    

    如果成功,則結果會是 1。請注意 exactlyOne 用於查詢運算式保證只有一個傳回的結果,否則,會回傳例外狀況 (Exception)。此外,為了更方便地處理 null 值時,可以使用定義於這個程式碼中的 nullable 函式去建立超出一般值的Null值。

設定實體資料模型

您應該完成這個程序,只有當您想要從資料庫產生完整的實體資料模型,而沒有一個用來測試的資料庫。

設定實體資料模型

  1. 在功能表列中,選擇**[SQL][辦理-SQL 編輯器],,[新查詢]**去產生資料庫。如果系統提示您時,請指定資料庫伺服器和執行個體。

  2. 複製和貼上資料庫指令碼的內容以建立學生資料庫,如 Creating the School Sample Database 所描述。

    在這個逐步解說中的後續步驟以 ADO.NET Entity Data Model Quickstart為基礎。

  3. 選取三角形符號的工具列按鈕或 Ctrl+Q 選取索引鍵來執行SQL 指令碼。

  4. 伺服器總管中,開啟捷徑功能表中的資料連接選擇加入連接然後輸入資料庫伺服器的名稱和執行個體的名稱及學校資料庫。

  5. 建立一個 C# 或 Visual Basic 主控台應用程式專案開啟捷徑功能表選擇加入新項目,接著選擇ADO.NET 實體資料模型

    [實體資料模型精靈] 隨即出現。您可以使用這個精靈,選取要如何建立實體資料模型。

  6. 在 [選擇模型內容] 對話方塊中,選取 [從資料庫產生]。

  7. 在下一個頁面中,選取新建立的 School 資料庫做為資料連接。

    這個連接應該類似 <servername>.<instancename>.School.dbo。

  8. 請複製實體連接字串加入至剪貼簿,因為該字串可能對之後很重要。

  9. 確認儲存實體連接字串 App.Config 檔案的核取方塊被選取,並記下文字方塊中的字串值,必要時應該可以協助您之後尋找連接字串。

  10. 在下一個頁面中,選擇資料表預存程序與函式.

    藉由選取這些最上層節點,也就是您所選擇的任何資料表、預存程序和函式。如果需要,您可以個別選取這些項目。

  11. 確定其他設定的核取方塊已選取。

    第一個複數化或單數化產生的物件名稱 核取方塊指出是否將單數改變為複數去符合表示在資料庫資料表中命名物件的慣例。包含在模型中的外部索引鍵資料行 核取方塊決定是否去包含加入其他產生資料庫結構描述的物件型別用途的欄位。第三個核取方塊是否在模型表示包含預存程序和函式。

  12. 選擇結束按鈕去產生一個以 School資料庫為基礎的實體資料模型的 .edmx檔。

    Model1.edmx檔案,加入至您的專案,且以資料庫圖表隨即出現。

  13. 在功能表列,選擇檢視其他視窗實體資料模型瀏覽器 去檢視所有模型的細節或是實體資料模型對應細節來開啟一個顯示如何產生物件模型對應資料庫資料表和資料行的視窗

後續步驟

藉由查看可用的查詢運算子瀏覽其他查詢以 查詢運算式 (F#)列出。

請參閱

工作

逐步解說:使用型別提供者和實體存取 SQL 資料庫 (F#)

參考

EdmxFile 型別提供者 (F#)

其他資源

型別提供者

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)