Tutorial: Generar tipos en F# a partir de un archivo de esquema EDMX (F#)

Este tutorial para F# 3.0 muestra cómo crear tipos para los datos que se representan por el Entity Data Model (EDM); el esquema para el cual se especifica en un archivo .edmx.Este tutorial también muestra cómo utilizar el proveedor de tipos de EdmxFile.Antes de comenzar, considere si un proveedor de tipo SqlEntityConnection es la mejor opción de los proveedores de tipos.El proveedor de tipos SqlEntityConnection funciona mejor en escenarios en los que se tiene una base de datos activa a la que se puede conectar en la fase de desarrollo del proyecto, y cuando no es ningún problema especificar la cadena de conexión en tiempo de compilación.Sin embargo, este proveedor de tipos también está limitado por el hecho de que no expone tanta funcionalidad de base de datos como el proveedor EdmxFile.Además, si no se tiene una conexión de base de datos activa para un proyecto de base de datos que utiliza Entity Data Model, se puede utilizar el archivo .edmx para codificar en la base de datos.Cuando se utiliza el provedor de tipos EdmxFile, el compilador de F# ejecuta EdmGen.exe y genera los tipos que éste proporciona.

Este tutorial muestra las siguientes tareas, que se deben realizar en el orden en que aparecen para que el tutorial tenga éxito:

  • Creación de un archivo EDMX

  • Creación del proyecto

  • Búsqueda o creación de la cadena de conexión para el Entity Data Model

  • Configuración del proveedor de tipos

  • Consulta de los datos

  • Llamada a un procedimiento almacenado

Creación de un archivo EDMX

Si ya tiene un archivo EDMX, puede omitir este paso.

Para crear un archivo EDMX

  • Si aún no tiene un archivo EDMX, puede seguir las instrucciones en la Guía rápida ADO.NET Entity Framework para crear un Entity Data Model y el archivo de EDMX para una base de datos.Como alternativa, puede consultar las instrucciones al final de este tutorial en el paso Configuración del Entity Data Model.

Creación del proyecto

En este paso, creará un proyecto y agregará las referencias adecuadas al mismo para utilizar el proveedor de tipo EDMX.

Cómo crear y configurar el proyecto

  1. Cierre el proyecto anterior, cree otro proyecto, y denomínelo SchoolEDM.

  2. En el Explorador de soluciones, abra el menú de acceso directo para Referencias y, a continuación, elija Agregar referencia.

  3. En el área Ensamblados, elija el nodo Framework.

  4. En la lista de ensamblados disponibles, elija los ensamblados System.Data.Entity y System.Data.Linq, y luego elija el botón Agregar para añadir referencias a estos ensamblados a su proyecto.

  5. En el área Ensamblados, seleccione el nodo Extensiones.

  6. En la lista de extensiones disponibles, agregue una referencia al ensamblado FSharp.Data.TypeProviders.

  7. Agregue el siguiente código para abrir los espacios de nombres adecuados.

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

Búsqueda o creación de la cadena de conexión para el Entity Data Model

La cadena de conexión para el Entity Data Model (cadena de conexión de EDMX) incluye no sólo la cadena de conexión para el proveedor de base de datos sino que también incluye información adicional.Por ejemplo, la cadena de conexión de EDMX para una base de datos de SQL Server simple es similar al siguiente código.

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

Para obtener más información sobre cadenas de conexión, consulte Connection Strings.

Cómo buscar o crear la cadena de conexión para el Entity Data Model

  • Las cadenas de conexión EDMX pueden resultar difíciles de generar manualmente, por lo que se puede ahorrar tiempo si se genera de forma programada.Si conoce la cadena de conexión EDMX, puede omitir este paso y usar simplemente dicha cadena en el paso siguiente.Si no la conoce, utilice el siguiente código para generar la cadena de conexión EDMX partiendo de una cadena de conexión a bases de datos proporcionada por Ud. mismo

    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)
    

Configuración del proveedor de tipos

En este paso se creará y configurará el proveedor de tipos con la cadena de conexión EDMX y se generarán los tipos para el esquema que se define en el archivo .edmx.

Cómo configurar el proveedor de tipos y generar tipos.

  1. Copie el archivo .edmx que se generó en el primer paso de este tutorial a la carpeta del proyecto.

  2. Abra el menú contextual para el nodo del proyecto en el proyecto de F#, elija Agregar el elemento existente y, a continuación, elija el archivo .edmx para agregarlo al proyecto.

  3. Escriba el siguiente código para activar el proveedor de tipos de su archivo .edmx.Reemplace Server\Instance con el nombre del servidor que ejecuta SQL Server y el nombre de la instancia y use el nombre de su archivo .edmx que puso en el primer paso de este tutorial.

    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)
    

Consulta de los datos

En este paso, se utilizan las expresiones de consulta de F# para consultar la base de datos.

Cómo consultar los datos

  • Escriba el siguiente código para consultar los datos en el modelo de datos de entidad.

    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)
    

Llamada a un procedimiento almacenado

Se puede llamar a procedimientos almacenados mediante el proveedor del tipo EDMX.En el siguiente procedimiento, la base de datos School contiene un procedimiento almacenado, UpdatePerson, que actualiza un registro, dados los nuevos valores para las columnas.Se puede utilizar este procedimiento almacenado porque está expuesto como un método en el tipo DataContext.

Cómo llamar un procedimiento almacenado

  • Agregue el siguiente código a los registros de actualización.

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

    El resultado es 1 si tiene éxito.Observe que exactlyOne se utiliza en la expresión de consulta para asegurarse de que sólo se devuelve un resultado; en caso contrario, se lanza una excepción.Ademaś, para trabajar con mayor facilidad con valores que puedan ser nulos,se puede utilizar la función simple nullable que se define en este código para crear un valor que pueda ser nulo a partir de un valor normal.

Configuración del Entity Data Model

Hay que terminar este procedimiento si se desea aprender a generar un Entity Data Model completo a partir de una base de datos y no se tiene una base de datos sobre la cual probarlo.

Cómo configurar el Entity Data Model

  1. Para crear una base de datos, elija, en la barra de menú, la opción SQL, Editor de Transact-SQL y Nueva consulta.Si se le solicita, especifique el servidor de bases de datos y la instancia.

  2. Copie y pegue los contenido del script de la base de datos que crea la base de datos student, tal y como se como describe en Creating the School Sample Database.

    Los siguientes pasos de este tutorial se basan en ADO.NET Entity Data Model Quickstart.

  3. Ejecute el script SQL bien eligiendo el botón de la barra de herramientas que tiene el símbolo de un triángulo o presionando las teclas Ctrl+Q.

  4. En el Explorador de servidores, abra el menú contextual para Conexiones de datos, elija Agregar conexión y, a continuación, escriba el nombre del servidor de bases de datos, el nombre de la instancia y luego la base de datos School.

  5. Cree un proyecto de aplicación de consola de C# o Visual Basic, abra el menú contextual, elija Agregar nuevo elemento y elija Entity Data Model de ADO.NET.

    Se abre el Asistente para Entity Data Model.Si se utiliza este asistente, se puede elegir cómo se desea crear un Entity Data Model.

  6. En Elegir contenidos de modelo, active la casilla de verificación Generar a partir de una base de datos.

  7. En la siguiente página, elija la base de datos School que acaba de crear School como la conexión de datos.

    Esta conexión debe ser similar a <servername>.<instancename>.School.dbo.

  8. Copie su cadena de conexión de entidad al portapapeles ya que esa cadena puede ser importante más adelante.

  9. Asegúrese de que la casilla para guardar la cadena de conexión de la entidad al archivo de App.Config está activada y anote el valor de cadena en el cuadro de texto, que le ayudará a buscar la cadena de conexión más adelante, si es necesario.

  10. En la siguiente página, escoja Tablas y Procedimientos almacenados y funciones.

    Al seleccionar estos nodos de nivel superior, se seleccionan todas las tablas, procedimientos almacenados y funciones.También se pueden seleccionar estos individualmente, si se desea.

  11. Asegúrese de que las casillas de los otros valores están activadas.

    La primera casilla Poner en plural o en singular los nombres de objeto generados indica si se deben cambiar las formas de singular a plural para hacerlas coincidir con las convenciones de nomenclatura de objetos que representan tablas en la base de datos.La casilla de verificación Incluir columnas de clave foránea en el modelo determina si se deben incluir los campos cuyo propósito es combinarse con otros campos en los tipos de objeto que se generan para el esquema de base de datos.La tercera casilla indica si se incluyen los procedimientos almacenados y las funciones en el modelo.

  12. Seleccione el botón Finalizar para generar un archivo .edmx que contenga un Entity Data Model basado en la base de datos School.

    Se agrega un archivo Model1.edmx al proyecto y aparece un diagrama de base de datos.

  13. En la barra de menú, elija Ver, Otras ventanas, Navegador del Entity Data Model para ver todos los detalles del modelo o elija Detalles de mapeo del Entity Data Model Mapping para abrir una ventana que muestre cómo el modelo de objetos generado se ajusta a las tablas y columnas de la base de datos.

Pasos siguientes

Explore otras consultas examinando los operadores de consulta disponibles que figuran en la lista de Expresiones de consulta (F#).

Vea también

Tareas

Tutorial: Obtener acceso a una base de datos SQL mediante proveedores de tipo y entidades (F#)

Referencia

EdmxFile (Proveedor de tipo de F#)

Otros recursos

Proveedores de tipo

ADO.NET Entity Framework

.edmx File Overview (Entity Framework)

Edm Generator (EdmGen.exe)