Freigeben über


Exemplarische Vorgehensweise: Generieren von F#-Typen aus einer EDMX-Schemadatei (F#)

In dieser exemplarischen Vorgehensweise für F# 3.0 wird gezeigt, wie Sie Typen für Daten erstellen, die vom Entity Data Model (EDM) dargestellt werden. Dessen Schema wird in einer EDMX-Datei angegeben. In dieser exemplarischen Vorgehensweise wird außerdem gezeigt, wie Sie den EdmxFile-Typanbieter verwenden. Bevor Sie beginnen, sollten Sie überlegen, ob ein SqlEntityConnection-Typanbieter eine besser geeignete Option ist. Der SqlEntityConnection-Typanbieter eignet sich sehr gut für Szenarien, in denen Sie in der Entwicklungsphase des Projekts eine Verbindung mit einer aktiven Datenbank herstellen können, wobei es Ihnen nichts ausmacht, zur Kompilierzeit die Verbindungszeichenfolge anzugeben. Diese Typanbieter weist jedoch die Einschränkung auf, dass er geringere Datenbankfunktionen als der EdmxFile-Typanbieter verfügbar macht. Wenn keine aktive Datenbankverbindung für ein Datenbankprojekt vorhanden ist, das das Entity Data Model verwendet, können Sie die EDMX-Datei zum Codieren für die Datenbank verwenden. Wenn Sie den EdmxFile-Typanbieter verwenden, führt der F#-Compiler EdmGen.exe aus, um die vom Typanbieter bereitgestellten Typen zu generieren.

Diese exemplarische Vorgehensweise veranschaulicht die folgenden Aufgaben, die Sie in der angegebenen Reihenfolge ausführen müssen, um die exemplarische Vorgehensweise erfolgreich abzuschließen:

  • Erstellen einer EDMX-Datei

  • Erstellen des Projekts

  • Suchen oder Erstellen der Entity Data Model-Verbindungszeichenfolge

  • Konfigurieren des Typanbieters

  • Abfragen der Daten

  • Aufrufen einer gespeicherten Prozedur

Erstellen einer EDMX-Datei

Wenn Sie bereits über eine EDMX-Datei verfügen, können Sie diesen Schritt überspringen.

So erstellen Sie eine EDMX-Datei

  • Wenn Sie nicht bereits über eine EDMX-Datei verfügen, können Sie den Anweisungen am Ende dieser exemplarischen Vorgehensweise im Schritt So konfigurieren Sie das Entity Data Model folgen.

Erstellen des Projekts

In diesem Schritt erstellen Sie ein Projekt und fügen die entsprechenden Verweise hinzu, um den EDMX-Typanbieter zu verwenden.

So erstellen und richten Sie ein F#-Projekt ein

  1. Schließen Sie das vorherige Projekt und erstellen Sie ein neues Projekt mit dem Namen SchoolEDM.

  2. Öffnen Sie im Projektmappen-Explorer das Kontextmenü für Verweise, und wählen Sie Verweis hinzufügen aus.

  3. Im Bereich Assemblys wählen Sie den Knoten Framework.

  4. In der Liste der verfügbaren Assemblys wählen Sie die Assemblys System.Data.Entity und System.Data.Linq. Dann wählen Sie die Schaltfläche Hinzufügen, um Ihrem Projekt Verweise auf diese Assemblys hinzuzufügen.

  5. Im Bereich Assemblys wählen Sie den Knoten Erweiterungen.

  6. In der Liste der verfügbaren Erweiterungen fügen Sie einen Verweis auf die Assembly FSharp.Data.TypeProviders hinzu.

  7. Fügen Sie den folgenden Code hinzu, um die entsprechende Namespaces zu öffnen.

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

Suchen oder Erstellen der Verbindungszeichenfolge für das Entity Data Model

Die Verbindungszeichenfolge für das Entity Data Model (EDMX-Verbindungszeichenfolge) enthält nicht nur die Verbindungszeichenfolge für den Datenbankanbieter, sondern auch zusätzliche Informationen. Beispielsweise kann eine EDMX-Verbindungszeichenfolge für eine einfache SQL Server-Datenbank wie folgt lauten.

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

Weitere Informationen über EDMX-Verbindungszeichenfolgen finden Sie unter Verbindungszeichenfolgen.

Suchen oder Erstellen der Verbindungszeichenfolge für das Entity Data Model

  • EDMX-Verbindungszeichenfolgen können manuell schwer zu erstellen sein, sodass Sie Zeit sparen, wenn Sie sie programmgesteuert generieren. Wenn Sie Ihre EDMX-Verbindungszeichenfolge kennen, können Sie diesen Schritt überspringen und die Verbindungszeichenfolge einfach im nächsten Schritt verwenden. Verwenden Sie andernfalls den folgenden Code, um die EDMX-Verbindungszeichenfolge aus einer Datenbankverbindungszeichenfolge zu generieren, die Sie bereitstellen.

    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)
    

Konfigurieren des Typanbieters

In diesem Schritt erstellen und konfigurieren Sie den Typanbieter mit der EDMX-Verbindungszeichenfolge, und Sie generieren Typen für das Schema, das in der EDMX-Datei definiert ist.

So konfigurieren Sie den Typanbieter und generieren Typen

  1. Kopieren Sie die EDMX-Datei, die Sie im ersten Schritt dieser exemplarischen Vorgehensweise generiert haben, in den Projektordner.

  2. Öffnen Sie das Kontextmenü für den Projektknoten in Ihrem F#-Projekt, wählen Sie Vorhandenes Element hinzufügen, und wählen Sie dann die EDMX-Datei, um sie dem Projekt hinzuzufügen.

  3. Geben Sie den folgenden Code ein, um den Typanbieter für die EDMX-Datei zu aktivieren. Ersetzen Sie Server\Instance durch den Namen Ihres Servers, auf dem SQL Server ausgeführt wird, und durch den Namen Ihrer Instanz. Verwenden Sie den Namen Ihrer EDMX-Datei aus dem ersten Schritt dieser exemplarischen Vorgehensweise.

    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)
    

Abfragen der Daten

In diesem Schritt verwenden Sie F#-Abfrageausdrücke, um die Datenbank abzufragen.

So fragen Sie Daten ab

  • Geben Sie den folgenden Code ein, um die Daten im Entity Data Model abzufragen.

    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)
    

Aufrufen einer gespeicherten Prozedur

Sie können gespeicherte Prozeduren aufrufen, indem Sie den EDMX-Typanbieter verwenden. In der folgenden Prozedur enthält die Datenbank School eine gespeicherte Prozedur UpdatePerson, die einen Datensatz aktualisiert, wenn neue Werte für die Spalten angegeben werden. Sie können diese gespeicherte Prozedur verwenden, da sie als Methode des DataContext-Typs verfügbar gemacht ist.

So rufen Sie eine gespeicherte Prozedur auf

  • Fügen Sie folgenden Code hinzu, um Datensätze zu aktualisieren.

    // 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"
    

    Bei erfolgreicher Ausführung lautet das Ergebnis 1. Beachten Sie, dass im Abfrageausdruck exactlyOne verwendet wird, um sicherzustellen, dass nur ein Ergebnis zurückgegeben wird. Andernfalls wird eine Ausnahme ausgelöst. Um einfacher mit Werten arbeiten zu können, die NULL zulassen, können Sie die nullable-Funktion verwenden, die in diesem Code definiert ist. Sie wandelt einen normalen Wert in einen Wert um, der NULL zulässt.

Konfigurieren des Entity Data Model

Dieses Verfahren ist nur erforderlich, wenn Sie wissen möchten, wie ein vollständiges Entity Data Model aus einer Datenbank generiert wird und Sie dafür keine Testdatenbank besitzen.

So konfigurieren Sie das Entity Data Model

  1. Wählen Sie in der Menüleiste SQL, dann Transact-SQL-Editor und Neue Abfrage, um eine Datenbank zu erstellen. Wenn Sie dazu aufgefordert werden, geben Sie Ihren Datenbankserver und die Datenbankinstanz an.

  2. Kopieren Sie den Inhalt des Datenbankskripts zum Erstellen der Studierendendatenbank, und fügen Sie ihn ein, wie in der Entity Framework-Dokumentation im Data Developer Center beschrieben.

  3. Führen Sie das SQL-Skript aus, indem Sie auf der Symbolleisten-Schaltfläche auf das Dreieck klicken oder die Tasten Ctrl+Q drücken.

  4. In Server-Explorer öffnen Sie das Kontextmenü für Datenverbindungen, wählen Verbindung hinzufügen und geben den Namen des Datenbankservers, den Instanznamen und die Datenbank School ein.

  5. Erstellen Sie ein Konsolenanwendungsprojekt in C#- oder Visual Basic, öffnen Sie das Kontextmenü, wählen Sie Neues Element hinzufügen und dann ADO.NET Entity Data Model.

    Der Assistent für Entity Data Model wird geöffnet. Mit diesem Assistenten können Sie auswählen, wie Sie das Entity Data Model erstellen möchten.

  6. Markieren Sie unter Modellinhalt auswählen das Kontrollkästchen Aus Datenbank generieren.

  7. Auf der nächsten Seite wählen Sie als Datenverbindung die neu erstellte Datenbank School aus.

    Diese Verbindung sollte <servername>.<instancename>.School.dbo entsprechen.

  8. Kopieren Sie die Entitätsverbindungszeichenfolge in die Zwischenablage, da sie später wichtig sein kann.

  9. Stellen Sie sicher, dass das Kontrollkästchen zum Speichern der Entitätsverbindungszeichenfolge in der Datei App.Config aktiviert ist, und notieren Sie sich den Zeichenfolgenwert im Textfeld. So können Sie später ggf. die Verbindungszeichenfolge finden.

  10. Auf der nächsten Seite wählen Sie Tabellen und Gespeicherte Prozeduren und Funktionen.

    Durch Auswahl dieser Knoten der obersten Ebene wählen Sie alle Tabellen, gespeicherten Prozeduren und Funktionen aus. Sie können diese auch einzeln auswählen.

  11. Stellen Sie sicher, dass die Kontrollkästchen für die anderen Einstellungen aktiviert sind.

    Das erste Kontrollkästchen Generierte Objektnamen in den Singular oder Plural setzen gibt an, ob Singularformen in den Plural geändert werden sollen oder umgekehrt, um Konventionen zum Benennen von Objekten zu erfüllen, die Datenbanktabellen darstellen. Das Kontrollkästchen Fremdschlüsselspalten in das Modell einbeziehen bestimmt, ob Felder eingeschlossen werden sollen, die mit anderen Feldern in den für das Datenbankschema generierten Objekttypen verknüpft werden sollen. Das dritte Kontrollkästchen gibt an, ob gespeicherte Prozeduren und Funktionen in das Modell eingeschlossen werden sollen.

  12. Wählen Sie die Schaltfläche Fertig stellen, um eine EDMX-Datei zu generieren, die ein auf der Datenbank School basierendes Entity Data Model enthält.

    Dem Projekt wird die Datei Model1.edmx hinzugefügt, und ein Datenbankdiagramm wird angezeigt.

  13. Wählen Sie in der Menüleiste Ansicht, dann Weitere Fenster und Entity Data Model-Browser, um alle Details des Modells anzuzeigen, oder wählen Sie Entity Data Model-Mappingdetails, um ein Fenster zu öffnen, in dem die Zuordnung des generierten Objektmodells zu Datenbanktabellen und -spalten gezeigt wird.

Nächste Schritte

Untersuchen Sie weitere Abfragen anhand der verfügbaren Abfrageoperatoren, die in Abfrageausdrücke (F#) aufgeführt sind.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Zugreifen auf eine SQL-Datenbank mithilfe von Typanbietern und Entitäten (F#)

Referenz

EdmxFile-Typanbieter (F#)

EDM-Generator (EdmGen.exe)

Weitere Ressourcen

Typanbieter

Entity Framework

.edmx File Overview (Entity Framework)