Compartir a través de


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

En este tutorial sobre F# 3.0 se muestra cómo crear tipos para los datos representados por el Entity Data Model (EDM), cuyo esquema se especifica en un archivo .edmx. En el tutorial también se muestra cómo usar el proveedor de tipo EdmxFile. Antes de comenzar, considere si un proveedor de tipo SqlEntityConnection sería una opción más adecuada. El proveedor de tipo 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 tipo 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 usa Entity Data Model, se puede utilizar el archivo .edmx para codificar en la base de datos. Cuando se usa el proveedor de tipo EdmxFile, el compilador de F# ejecuta EdmGen.exe para generar los tipos que proporciona.

En este tutorial se muestran las tareas siguientes, que se deben realizar en el orden presentado a continuación para finalizarlo correctamente:

  • Crear un archivo EDMX

  • Crear el proyecto

  • Buscar o crear la cadena de conexión de Entity Data Model

  • Configurar el proveedor de tipo

  • Consultar los datos

  • Llamar a un procedimiento almacenado

Crear 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 que aparecen al final de este tutorial en el paso Para configurar el Entity Data Model.

Crear el proyecto

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

Para crear y configurar un proyecto de F#

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

  2. En el Explorador de soluciones, haga clic en el menú contextual 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, a continuación, elija el botón Agregar para agregar 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 código siguiente para abrir los espacios de nombres adecuados.

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

Buscar o crear la cadena de conexión para Entity Data Model

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

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 las cadenas de conexión EDMX, vea Cadenas de conexión.

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

  • Las cadenas de conexión EDMX pueden ser difíciles de generar manualmente, por lo que se puede ahorrar tiempo si se generan mediante programación. Si conoce la cadena de conexión EDMX, puede omitir este paso y simplemente usar dicha cadena en el paso siguiente. En caso contrario, use el código que aparece a continuación para generar la cadena de conexión EDMX a partir de una cadena de conexión de base de datos que usted mismo proporcione.

    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)
    

Configurar el proveedor de tipo

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

Para configurar el proveedor de tipo y generar tipos

  1. Copie el archivo .edmx generado en el primer paso de este tutorial en la carpeta del proyecto.

  2. Abra el menú contextual del nodo del proyecto de F#, elija Agregar 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 tipo del archivo .edmx. Reemplace Server\Instance por el nombre del servidor que ejecuta SQL Server y el nombre de su instancia y use el nombre del archivo .edmx del 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)
    

Consultar los datos

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

Para consultar los datos

  • Escriba el código siguiente para consultar los datos en el 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)
    

Llamar a un procedimiento almacenado

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

Para llamar a un procedimiento almacenado

  • Agregue el código siguiente para actualizar los registros:

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

    Si la acción se realiza correctamente, el resultado es 1. Tenga en cuenta que exactlyOne se usa en la expresión de consulta para asegurarse de que solo se devuelve un resultado; de lo contrario, se produce una excepción. Además, para trabajar más fácilmente con valores que aceptan valores NULL, se puede usar la función simple nullable definida en este código para crear un valor que acepte valores NULL a partir de un valor normal.

Configurar el Entity Data Model

Solo debe completar este procedimiento si desea aprender a generar un Entity Data Model completo a partir de una base de datos y no tiene una base de datos para probar.

Para configurar el Entity Data Model

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

  2. Copie y pegue el contenido del script de base de datos que crea la base de datos Student, como se describe en la documentación de Entity Framework del Centro para desarrolladores de datos.

  3. Ejecute el script SQL; para ello, elija el botón de la barra de herramientas con el símbolo del triángulo o presione las teclas Ctrl+Q.

  4. En el Explorador de servidores, abra el menú contextual de Conexiones de datos, elija Agregar conexión y, a continuación, especifique el nombre del servidor de bases de datos, el nombre de la instancia y 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, después, Entity Data Model de ADO.NET.

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

  6. En Elegir contenido del modelo, active la casilla Generar desde la base de datos.

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

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

  8. Copie la cadena de conexión de la entidad en el Portapapeles, ya que puede ser importante más adelante.

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

  10. En la página siguiente, elija Tablas y Funciones y procedimientos almacenados.

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

  11. Asegúrese de que las casillas del resto de 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 los objetos que representan tablas de bases de datos. La casilla Incluir columnas de clave externa 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 deben incluir las funciones y los procedimientos almacenados 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 el archivo Model1.edmx al proyecto y aparece un diagrama de base de datos.

  13. En la barra de menús, elija Ver, Otras ventanas, Explorador de Entity Data Model para ver todos los detalles del modelo o bien Detalles de la asignación de Entity Data Model para abrir una ventana que muestra cómo el modelo de objetos generado se asigna a las tablas y columnas de la base de datos.

Pasos siguientes

Para ver otras consultas, examine los operadores de consulta disponibles que se indican en 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#)

Generador de EDM (EdmGen.exe)

Otros recursos

Proveedores de tipo

Entity Framework

.edmx File Overview (Entity Framework)