Procédure pas à pas : génération de types F# à partir d'un fichier de schéma EDMX (F#)
Cette procédure pas à pas pour F# 3.0 indique comment créer des types pour les données qui sont représentées par l'EDM (Entity Data Model), le schéma spécifié pour un fichier .edmx. Elle montre également comment utiliser le fournisseur de type EdmxFile. Avant de commencer, déterminez si un fournisseur de type SqlEntityConnection est une option de fournisseur de type plus appropriée. Le fournisseur de type SqlEntityConnection est plus performant pour les scénarios où vous pouvez vous connecter à une base de données active pendant la phase de développement de votre projet, et où vous ne vous occupez pas de spécifier la chaîne de connexion au moment de la compilation. Toutefois, ce fournisseur de type est également limité, car il ne dispose pas d'autant de fonctionnalités de base de données que le fournisseur de type EdmxFile. En outre, si vous n'avez pas une connexion de base de données active pour un projet de base de données qui utilise l'Entity Data Model, vous pouvez utiliser le fichier .edmx pour coder la base de données. Lorsque vous utilisez le fournisseur de type EdmxFile, le compilateur F# exécute EdmGen.exe pour générer les types qu'il fournit.
Les tâches suivantes, décrites dans cette procédure pas à pas, doivent être exécutées dans cet ordre pour la réussite de cette dernière :
Création d'un fichier EDMX
Création du projet
Recherche ou création de la chaîne de connexion de l'Entity Data Model
Configuration du fournisseur de type
Interrogation des données
Appel d'une procédure stockée
Création d'un fichier EDMX
Si vous disposez déjà d'un fichier EDMX, vous pouvez ignorer cette étape.
Pour créer un fichier EDMX
- Si nous ne disposez pas de fichier EDMX, suivez les instructions décrites dans l'étape Pour configurer l'Entity Data Model, à la fin de cette procédure pas à pas.
Création du projet
Dans cette étape, vous créez un projet et y ajoutez les références appropriées pour utiliser le fournisseur de type EDMX.
Pour créer et configurer le projet F#
Fermez le projet précédent, créez un autre projet, et nommez-le SchoolEDM.
Dans l'Explorateur de solutions, ouvrez le menu contextuel Références, puis choisissez Ajouter une référence.
Dans la zone Assemblys, choisissez le nœud Framework.
Dans la liste d'assemblys disponibles, choisissez les assemblys System.Data.Entity et System.Data.Linq, puis choisissez le bouton Ajouter pour ajouter des références à ces assemblys à votre projet.
Dans la zone Assemblys, sélectionnez le nœud Extensions.
Dans la liste d'extensions disponibles, ajoutez une référence à l'assembly FSharp.Data.TypeProviders.
Ajoutez le code suivant pour ouvrir les espaces de noms appropriés.
open System.Data.Linq open System.Data.Entity open Microsoft.FSharp.Data.TypeProviders
Recherche ou création de la chaîne de connexion pour l'Entity Data Model
La chaîne de connexion pour l'Entity Data Model (chaîne de connexion EDMX) comprend non seulement la chaîne de connexion du fournisseur de base de données mais également des informations supplémentaires. Par exemple, pour une base de données SQL Server simple, la chaîne de connexion EDMX ressemble au code suivant.
let edmConnectionString = "metadata=res://*/;provider=System.Data.SqlClient;Provider Connection String='Server=SERVER\Instance;Initial Catalog=DatabaseName;Integrated Security=SSPI;'"
Pour plus d'informations sur les chaînes de connexion EDMX, consultez Chaînes de connexion.
Pour rechercher ou créer la chaîne de connexion pour l'Entity Data Model
Générer des chaînes de connexion EDMX manuellement peut s'avérer difficile ; vous pouvez gagner du temps en les générant par programmation. Si vous connaissez la chaîne de connexion EDMX, vous pouvez ignorer cette étape et utiliser simplement cette chaîne dans l'étape suivante. Sinon, utilisez le code suivant pour générer la chaîne de connexion EDMX à partir d'une chaîne de connexion d'une base de données fournie par vos soins.
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)
Configuration du fournisseur de type
Dans cette étape, vous créez et configurez le fournisseur de type avec la chaîne de connexion EDMX, et vous générez des types pour le schéma défini dans le fichier .edmx.
Pour configurer le fournisseur de type et générer des types
Copiez le fichier .edmx créé au cours de la première étape de cette procédure dans le dossier du projet.
Ouvrez le menu contextuel du nœud de projet dans votre projet F#, choisissez Ajouter un élément existant, puis choisissez le fichier .edmx pour l'ajouter à votre projet.
Entrez le code suivant pour activer le fournisseur de type de votre fichier .edmx. Remplacez Server\Instance par le nom du serveur qui exécute SQL Server et le nom de votre instance, et utilisez le nom du fichier .edmx de la première étape de cette procédure pas à pas.
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)
Interrogation des données
Dans cette étape, des expressions de requête F# sont utilisées pour interroger la base de données.
Pour interroger les données
Entrez le code suivant pour interroger les données dans un Entity Data Model.
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)
Appel d'une procédure stockée
Vous pouvez appeler des procédures stockées à l'aide du fournisseur de type EDMX. Dans la procédure suivante, la base de données School contient une procédure stockée, UpdatePerson, qui met à jour un enregistrement à l'aide de nouvelles valeurs des colonnes. Cette procédure stockée peut être utilisée, car elle est exposée en tant que méthode sur le type DataContext.
Pour appeler une procédure stockée
Ajoutez le code suivant pour mettre à jour des enregistrements.
// 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"
En cas de réussite, le résultat est 1. Notez que exactlyOne est utilisé dans l'expression de requête pour garantir qu'un seul résultat est retourné ; sinon, une exception est levée. De plus, pour faciliter l'utilisation des valeurs Nullable, vous pouvez utiliser la fonction simple nullable définie dans ce code pour créer une valeur Nullable à partir d'une valeur ordinaire.
Configuration de l'Entity Data Model
Effectuez cette procédure uniquement si vous souhaitez savoir comment générer un Entity Data Model complet à partir d'une base de données et si vous ne disposez pas de base de données avec laquelle effectuer un test.
Pour créer l'Entity Data Model
Dans la barre de menus, choisissez SQL, Éditeur Transact-SQL, Nouvelle requête pour créer une base de données. Si vous y êtes invité, spécifiez votre serveur et instance de base de données.
Copiez et collez le contenu du script de base de données qui crée la base de données Student, comme décrit dans la Documentation Entity Framework dans le Centre de développement Accès aux données.
Exécutez le script SQL en choisissant le bouton dans la barre d'outils en forme de triangle ou avec le raccourci clavier Ctrl+Q.
Dans l'Explorateur de serveurs, ouvrez le menu contextuel Connexions de données, choisissez Ajouter une connexion, puis entrez le nom du serveur de base de données, le nom de l'instance, et la base de données School.
Créez un projet d'application console C# ou Visual Basic, ouvrez le menu contextuel, choisissez Ajouter un nouvel élément, puis ADO.NET Entity Data Model.
L'Assistant Entity Data Model s'ouvre. À l'aide de cet assistant, vous pouvez choisir la façon dont vous souhaitez créer l'Entity Data Model.
Sous Choisir le contenu du modèle, activez la case à cocher Générer à partir de la base de données.
Sur la page suivante, choisissez la base de données School nouvellement créée comme connexion de données.
Cette connexion doit ressembler à <servername>.<instancename>.School.dbo.
Copiez votre chaîne de connexion d'entité dans le Presse-papiers, car elle sera importante ultérieurement.
Assurez-vous que la case à cocher pour enregistrer la chaîne de connexion d'entité dans le fichier App.Config est sélectionnée, et notez la valeur de chaîne dans la zone de texte ; cela vous permettra de localiser la chaîne de connexion ultérieurement, si nécessaire.
Sur la page suivante, choisissez Tables et Procédures et fonctions stockées.
En choisissant ces nœuds de niveau supérieur, vous sélectionnez toutes les tables, les procédures stockées, et les fonctions. Vous pouvez également choisir ces éléments individuellement, si vous le souhaitez.
Vérifiez que les cases à cocher des autres paramètres sont sélectionnées.
La première case à cocher Mettre au pluriel ou au singulier les noms d'objets générés indique si les formes au singulier doivent être mises au pluriel pour correspondre aux conventions d'affectation de noms des objets qui représentent des tables de base de données. La case à cocher Inclure les colonnes clés étrangères dans le modèle détermine s'il faut inclure des champs dont l'objectif est de joindre d'autres champs dans les types d'objets générés pour le schéma de base de données. La troisième case à cocher indique s'il faut inclure les procédures et fonctions stockées dans le modèle.
Sélectionnez le bouton Terminer pour générer un fichier .edmx qui contient un Entity Data Model basé sur la base de données School.
Un fichier, Model1.edmx, est ajouté à votre projet, et un schéma de base de données apparaît.
Dans la barre de menus, choisissez Afficher, Autres fenêtres, Explorateur EDM pour afficher tous les détails du modèle ou Détails de mappage EDM pour ouvrir une fenêtre qui montre comment le modèle objet généré se mappe sur des tables et des colonnes de la base de données.
Étapes suivantes
Explorez d'autres requêtes en examinant les opérateurs de requête disponibles répertoriés dans Expressions de requête (F#).
Voir aussi
Tâches
Référence
EdmxFile, fournisseur de type (F#)