📌 En síntesis: Mapeo objeto-relacional (ORM) en .NET: DbContext, consultas LINQ, migraciones de esquema y operaciones CRUD con Entity Framework Core.
Guía técnica desarrollada por el equipo de Proyecto Luna para formación profesional y consulta técnica abierta.
En el desarrollo de aplicaciones de escritorio modernas, la gestión de información persistente constituye un aspecto fundamental para la resolución de problemas de mediana complejidad. A diferencia de aplicaciones simples que solo procesan datos en memoria, los sistemas reales requieren almacenar información de forma permanente, permitiendo su recuperación, modificación y eliminación a lo largo del tiempo. Esta necesidad implica integrar la interfaz gráfica con una base de datos que respalde el funcionamiento de la aplicación. En el ecosistema .NET, Entity Framework se presenta como una herramienta clave para facilitar esta integración. Entity Framework es un Object Relational Mapper (ORM) que permite trabajar con bases de datos relacionales utilizando clases del lenguaje C#. Mediante este enfoque, las tablas de la base de datos se representan como entidades, y cada registro corresponde a una instancia de una clase, lo que favorece el uso de la programación orientada a objetos y reduce la dependencia directa de sentencias SQL. Por su parte, SQL Server es un sistema de gestión de bases de datos relacional ampliamente utilizado en entornos académicos y profesionales. Su integración nativa con .NET permite desarrollar aplicaciones seguras, eficientes y escalables. La combinación de SQL Server, Entity Framework y aplicaciones WPF posibilita la construcción de soluciones completas, donde la interacción del usuario a través de la interfaz gráfica se traduce en operaciones concretas sobre los datos, fortaleciendo la capacidad de resolver problemas de mediana complejidad de manera estructurada y coherente. Finalmente, la integración de estas tecnologías en aplicaciones WPF permite construir interfaces gráficas intuitivas y reactivas, donde los datos pueden ser visualizados y manipulados de manera eficiente. La vinculación de datos (data binding) propia de WPF, combinada con Entity Framework, facilita la sincronización entre la interfaz y la base de datos,
🚀 Introducción
mejorando la experiencia del usuario y reduciendo la complejidad del código. En conjunto, este enfoque tecnológico constituye una base sólida para el desarrollo de aplicaciones de escritorio modernas, orientadas a la resolución de problemas de mediana complejidad con criterios de calidad, orden y sostenibilidad en el tiempo.
Entity Framework es una tecnología de acceso a datos que forma parte del ecosistema .NET y que permite interactuar con bases de datos relacionales mediante objetos y clases en C#. En lugar de manipular directamente tablas y consultas SQL, el desarrollador trabaja con entidades que representan la estructura de la base de datos, manteniendo una mayor coherencia con los principios de la programación orientada a objetos. (Microsoft, 2024) Este enfoque facilita la comprensión del código y mejora su mantenibilidad, ya que las operaciones sobre los datos se realizan a través de métodos y propiedades de clases bien definidas. En aplicaciones WPF, Entity Framework actúa como un intermediario entre la interfaz gráfica y la base de datos, permitiendo que las acciones del usuario se reflejen de forma directa y controlada en la información almacenada. Además, el uso de Entity Framework reduce la probabilidad de errores asociados a consultas mal construidas y favorece el desarrollo de aplicaciones más robustas, donde la lógica de negocio se encuentra claramente separada del acceso a datos.
🔹 Integración de Entity Framework con SQL Server
La integración de Entity Framework con SQL Server permite que una aplicación WPF desarrollada en .NET se comunique con una base de datos relacional de forma eficiente, segura y estructurada. SQL Server cumple un rol fundamental dentro de los proyectos .NET, ya que actúa como el repositorio central de la información del sistema, garantizando la persistencia, integridad y disponibilidad de los datos utilizados por la aplicación. A través de esta integración, las tablas de la base de datos se representan como entidades dentro de la aplicación, mientras que un contexto de datos se encarga de administrar la conexión, el seguimiento de cambios y la
⚙️ Bases de datos con Entity Framework
ejecución de las operaciones sobre la información. Este enfoque permite que el desarrollador trabaje principalmente con clases y objetos en C#, dejando en manos del framework la generación y ejecución de las instrucciones necesarias para interactuar con SQL Server. Un aspecto clave de esta integración es el uso de migraciones de Entity Framework, las cuales permiten crear y actualizar la estructura de la base de datos a partir de las clases definidas en la aplicación. Mediante este mecanismo, el desarrollador puede generar automáticamente tablas y relaciones sin necesidad de escribir manualmente las sentencias SQL, asegurando que el modelo de datos en C# se mantenga sincronizado con la base de datos en SQL Server. En el caso práctico desarrollado, la base de datos fue creada inicialmente y las tablas se generaron automáticamente a través del proceso de migración. La importancia de SQL Server en proyectos .NET radica en su amplia adopción en entornos profesionales y empresariales, donde se utiliza para soportar sistemas reales como aplicaciones de gestión académica, plataformas de ventas, sistemas de inventario, control de clientes y administración de usuarios. En estos escenarios, SQL Server proporciona mecanismos de seguridad, respaldo y control de transacciones que resultan esenciales para el funcionamiento confiable de las aplicaciones. Asimismo, la combinación de SQL Server con Entity Framework y el uso de migraciones facilitan el mantenimiento y la evolución de los sistemas, ya que los cambios en la estructura de las clases pueden reflejarse directamente en la base de datos sin necesidad de reescribir grandes volúmenes de código. Esta capacidad resulta especialmente relevante en aplicaciones de mediana complejidad, donde los requerimientos suelen evolucionar con el tiempo y es necesario adaptar el sistema a nuevas necesidades del entorno real.
⚙️ Operaciones CRUD con Entity Framework
Las operaciones CRUD (Create, Read, Update y Delete) constituyen el conjunto de acciones fundamentales para la gestión de información en una base de datos relacional. En el contexto de aplicaciones WPF desarrolladas con el lenguaje C#, estas operaciones permiten que la información ingresada, consultada o modificada desde la interfaz gráfica se refleje de manera directa y persistente en una base de datos SQL Server. (Microsoft, 2025) Entity Framework facilita la implementación de estas operaciones mediante métodos específicos que permiten insertar, buscar, modificar y eliminar registros utilizando clases y objetos en lugar de sentencias SQL explícitas. Este enfoque reduce la complejidad del código, mejora su legibilidad y favorece la aplicación de principios de la programación orientada a objetos, lo que resulta especialmente relevante al abordar problemas de mediana complejidad. En aplicaciones WPF, las operaciones CRUD suelen ejecutarse como respuesta a eventos generados por el usuario, tales como el clic de un botón, la selección de un registro o la confirmación de una acción. De este modo, la interfaz gráfica actúa como el punto de interacción, mientras que Entity Framework se encarga de gestionar la comunicación con la base de datos, asegurando la coherencia y consistencia de la información. La correcta implementación de las operaciones CRUD permite que una aplicación evolucione desde un sistema estático hacia una solución funcional y dinámica, capaz de administrar información real de manera estructurada y coherente. Por esta razón, el dominio de estas operaciones representa un paso clave en la formación del estudiante y en el desarrollo de aplicaciones de escritorio completas dentro del ecosistema .NET.
🔹 Guardar información
Guardar información en una base de datos significa agregar un nuevo
registro, lo que en SQL Server se realiza mediante la instrucción INSERT. En este evento, esta operación se implementa utilizando Entity Framework, sin escribir sentencias SQL directamente. Desde la interfaz gráfica WPF, el usuario ingresa los datos del cliente (nombre, correo y teléfono) en los TextBox. Al presionar el botón Guardar, la aplicación crea un objeto de tipo Cliente y asigna a sus propiedades los valores ingresados por el usuario. Luego, este objeto se agrega al contexto de datos mediante el método Add(). Finalmente, al ejecutar SaveChanges(), Entity Framework se encarga automáticamente de generar y ejecutar la instrucción INSERT en SQL Server. De esta manera, el registro queda almacenado de forma permanente en la base de datos, facilitando el ingreso de nuevos clientes al sistema.
🔹 Buscar información
Buscar información en una base de datos corresponde a la instrucción SELECT en SQL Server, la cual permite obtener registros almacenados en una tabla. En el proyecto desarrollado, esta operación se realiza utilizando Entity Framework y se refleja principalmente en la carga de datos dentro del DataGrid. Al iniciar la aplicación, o después de realizar una operación como guardar, modificar o eliminar, se ejecuta el método CargarClientes(). Este método utiliza ToList() para obtener todos los clientes almacenados en la base de datos y mostrarlos en el DataGrid. Además, cuando el usuario selecciona una fila del DataGrid, la aplicación recupera automáticamente los datos del cliente seleccionado y los muestra en los TextBox. Esto permite visualizar la información y prepararla para futuras acciones, como modificar o eliminar registros.
🔹 Modificar información
Modificar información en una base de datos equivale a la instrucción UPDATE en SQL Server, la cual permite cambiar los datos de un registro existente. En Entity Framework, esta operación se realiza de forma automática cuando se modifican los valores de una entidad que ya fue cargada desde la base de datos. En la aplicación, el usuario selecciona un cliente desde el DataGrid. Al hacerlo, los datos del cliente se cargan en los TextBox. Luego, el usuario puede cambiar el nombre, correo o teléfono y presionar el botón Modificar. Al ejecutar SaveChanges(), Entity Framework detecta que los datos del objeto Cliente han cambiado y genera internamente la instrucción UPDATE correspondiente en SQL Server. De esta forma, la información se actualiza tanto en la base de datos como en la interfaz gráfica.
🔹 Eliminar información
Eliminar información en una base de datos corresponde a la instrucción DELETE en SQL Server, la cual permite borrar un registro de una tabla. En el proyecto, esta operación se implementa utilizando Entity Framework a través del método Remove(). Para eliminar un cliente, el usuario debe seleccionar una fila del DataGrid y presionar el botón Eliminar. Antes de realizar la acción, la aplicación muestra un mensaje de confirmación para evitar eliminaciones accidentales. Si el usuario confirma, el cliente seleccionado se marca para eliminación. Finalmente, al ejecutar SaveChanges(), Entity Framework genera y ejecuta la instrucción DELETE en SQL Server, eliminando el registro de forma definitiva. Esta operación permite mantener la información actualizada y eliminar datos que ya no son necesarios dentro del sistema.
⚙️ Entity Framework y resolución de problemas
La aplicación de Entity Framework en conjunto con interfaces gráficas desarrolladas en WPF permite abordar problemas de mediana complejidad mediante soluciones prácticas y funcionales. En este contexto, los conceptos revisados se materializan en un caso práctico, donde la aplicación integra la interacción del usuario con una base de datos SQL Server, permitiendo gestionar información de forma persistente y estructurada. (Microsoft, 2025) En un escenario práctico, la aplicación WPF actúa como el punto de contacto entre el usuario y el sistema, proporcionando formularios y controles gráficos para el ingreso, consulta y gestión de datos. Cada acción realizada desde la interfaz, como guardar, buscar, modificar o eliminar información, genera eventos que son procesados por la lógica en C#, la cual utiliza Entity Framework para ejecutar las operaciones correspondientes sobre la base de datos. A continuación, se desarrollará un ejemplo práctico que permitirá aplicar los conceptos revisados a lo largo de este apartado. En dicho ejemplo se integrará una aplicación WPF con Entity Framework y una base de datos SQL Server, implementando operaciones de agregado, búsqueda, modificación y eliminación de información. Este ejercicio tiene como propósito evidenciar, de forma concreta, cómo la interfaz gráfica, la lógica de programación en C# y el acceso a datos trabajan de manera conjunta para resolver un problema de mediana complejidad en un contexto cercano a situaciones reales de desarrollo de software. Empezaremos creando una aplicación de tipo WPF, definiendo tanto el nombre del proyecto como el nombre de la solución. Esta configuración inicial es importante, ya que permite organizar correctamente la estructura del sistema y facilitar su identificación dentro del entorno de desarrollo. En este caso, se utilizará un nombre representativo que refleje la funcionalidad de la aplicación a desarrollar.
Una vez creado el proyecto, Visual Studio carga automáticamente el entorno de desarrollo y muestra la estructura básica de una aplicación WPF. En esta etapa inicial, el sistema aún no cuenta con funcionalidades adicionales ni con soporte para bases de datos, por lo que será necesario incorporar los componentes requeridos para el acceso a datos.
Imagen 1. Configuración del nombre del proyecto y de la solución en Visual Studio (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
Imagen 2. Vista inicial del proyecto WPF recién creado en Visual Studio (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
Para integrar Entity Framework al proyecto, es necesario acceder al Administrador de paquetes NuGet, herramienta que permite instalar bibliotecas y extensiones externas dentro de una solución .NET. Esta herramienta se encuentra en la parte superior del entorno de Visual Studio, dentro del menú Herramientas. Al abrir el Administrador de paquetes NuGet, se puede observar que el proyecto no posee aún paquetes instalados relacionados con acceso a bases de datos. Por esta razón, se debe utilizar la opción Examinar, la cual permite buscar nuevos paquetes disponibles en el repositorio oficial de NuGet.
Imagen 3. Acceso al Administrador de paquetes NuGet desde el menú
Herramientas de Visual Studio Fuente: Elaboración propia a partir de Visual Studio 2026 Community
Imagen 4. Administrador de paquetes NuGet sin paquetes instalados en el proyecto (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
En el apartado de búsqueda se debe ingresar el término EntityFramework, seleccionando específicamente la versión correspondiente a Entity Framework clásico (EF 6.x). Esta versión es la adecuada para proyectos WPF basados en .NET Framework y permite trabajar con bases de datos SQL Server mediante un enfoque ORM. Una vez seleccionado el paquete, se procede a instalarlo en el proyecto. Durante el proceso de instalación, Visual Studio solicitará la aceptación de los términos de licencia correspondientes al paquete y a sus dependencias. Esta aceptación es necesaria para completar la instalación y habilitar el uso de Entity Framework dentro del proyecto.
Imagen 5. Búsqueda y selección del paquete EntityFramework desde NuGet (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
Imagen 6. Aplicación de cambios para la instalación de Entity Framework (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
Una vez finalizado el proceso, el paquete queda correctamente instalado en el proyecto, junto con sus dependencias necesarias para la conexión con SQL Server. A partir de este momento, la aplicación WPF cuenta con el soporte necesario para implementar acceso a datos mediante Entity Framework y comenzar el desarrollo de funcionalidades relacionadas con bases de datos. Una vez finalizado el proceso, el paquete queda correctamente instalado en el proyecto, junto con sus dependencias necesarias para la conexión con SQL Server. A partir de este momento, la aplicación WPF cuenta con el soporte necesario para implementar acceso a datos mediante Entity Framework y comenzar el desarrollo de funcionalidades relacionadas con bases de datos. Podemos verificar esto en el apartado de instalación de la herramienta NuGet.
Imagen 7. Aceptación de los términos de licencia para la instalación
de Entity Framework Fuente: Elaboración propia a partir de Visual Studio 2026 Community
Para continuar con la configuración de la base de datos y habilitar el uso de operaciones CRUD dentro de la aplicación WPF, se utilizará la herramienta DBeaver, la cual permite administrar bases de datos relacionales a través de una interfaz gráfica. En este caso, DBeaver se empleará para establecer una conexión con el motor de base de datos SQL Server y ejecutar las sentencias SQL necesarias para la creación de la base de datos. Una vez iniciada la creación de la conexión, se debe seleccionar SQL Server como motor de base de datos. Esta selección permite configurar una conexión compatible con el sistema de gestión de bases de datos utilizado por la aplicación .NET.
Imagen 8. Entity Framework instalado correctamente en el proyecto WPF. (Fuente: Elaboración propia a partir de Visual Studio 2026 Community)
Imagen 9. Acceso a la opción de creación de una nueva conexión a
base de datos en DBeaver Fuente: elaboración propia a partir de Dbeaver
Posteriormente, se deben ingresar los datos de conexión correspondientes al servidor. En este caso, el servidor se encuentra alojado de forma local (localhost), junto con el puerto de conexión y las credenciales del usuario configurado en SQL Server. Estos datos permiten establecer una comunicación directa entre DBeaver y el motor de base de datos.
Imagen 10. Selección del motor de base de datos SQL Server en DBeaver (Fuente: elaboración propia a partir de Dbeaver)
Imagen 11. Configuración del host y credenciales para la conexión con SQL Server (Fuente: elaboración propia a partir de Dbeaver)
Una vez creada la conexión, es necesario abrir un Script SQL asociado al servidor para poder escribir y ejecutar las sentencias SQL iniciales. En esta etapa, el uso del script se limita únicamente a la creación de la base de datos, ya que la definición de las tablas y su estructura será realizada posteriormente mediante el mecanismo de migraciones de Entity Framework. En el script SQL se ingresan las instrucciones necesarias para crear la base de datos que será utilizada por el sistema, la cual estará orientada a la gestión de clientes. De esta forma, se prepara el entorno de datos para que Entity Framework pueda encargarse de generar las tablas correspondientes a partir de las clases definidas en el proyecto. Código para DG: CREATE DATABASE GestionClientesDB; GO USE GestionClientesDB; GO
Imagen 12. Apertura de un nuevo Script SQL en el servidor SQL Server desde DBeaver (Fuente: elaboración propia a partir de Dbeaver)
Imagen 13. Script SQL para la creación de la base de datos GestionClientesDB (Fuente: elaboración propia a partir de Dbeaver)
Estas sentencias crean la base de datos GestionClientesDB, la cual funcionará como repositorio de información para la aplicación WPF. La estructura de las tablas no se define en esta etapa, ya que será generada automáticamente por Entity Framework a través del uso de migraciones, garantizando la coherencia entre el modelo de datos en C# y la base de datos en SQL Server. Para continuar con el desarrollo de la aplicación, es necesario regresar al proyecto creado en Visual Studio. En esta etapa se definirá el modelo de datos, el cual permitirá representar, mediante clases en C#, la estructura de la base de datos creada previamente en SQL Server. En primer lugar, se debe hacer clic derecho sobre el proyecto GestionClientesWPF dentro del Explorador de soluciones y seleccionar la opción para crear una nueva carpeta. Tendremos que dar clic derecho y agregar la carpeta.
Imagen 14. Creación de una nueva carpeta dentro del proyecto GestionClientesWPF (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 15. Vista del Explorador de soluciones con la opción para agregar una nueva carpeta (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
La carpeta creada se denominará Models, siguiendo una convención ampliamente utilizada en aplicaciones .NET. En esta carpeta se almacenarán las clases que representan las entidades del sistema, es decir, los objetos que se relacionan directamente con las tablas de la base de datos. Una vez creada la carpeta Models, se debe proceder a agregar un nuevo archivo de tipo Clase. Para ello, se hará clic derecho sobre la carpeta y se selecciona la opción Agregar Clase. La clase creada deberá llamarse Cliente.cs, ya que representará a los clientes que serán registrados, consultados, modificados y eliminados dentro del sistema. Esta clase define la estructura del modelo de datos que será utilizada por Entity Framework para generar posteriormente la tabla Cliente en la base de datos SQL Server mediante el uso de migraciones, asegurando la correspondencia entre la clase en C# y la estructura de la base de datos.
Imagen 16. Carpeta Models creada para almacenar las clases del modelo de datos (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 17. Agregar una nueva clase dentro de la carpeta Models (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Al crear el archivo, Visual Studio genera automáticamente la estructura básica de una clase en C#. Esta estructura inicial sirve como punto de partida para definir los atributos y configuraciones necesarias para la integración con Entity Framework.
Imagen 18. Creación de la clase Cliente.cs en el proyecto (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 19. Estructura inicial de la clase Cliente.cs generada por Visual Studio (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Posteriormente, se deben definir los atributos de la clase que representarán las columnas de la tabla Cliente en la base de datos. Es fundamental que estos atributos sean públicos y cuenten con los métodos get y set, ya que Entity Framework utiliza estas propiedades para mapear correctamente la clase con la tabla correspondiente. En caso de que los atributos sean privados, la relación entre la clase y la base de datos no se realiza correctamente. Además, se utiliza la anotación [Key] para indicar la clave primaria de la entidad, reforzando la relación entre el modelo de datos y la estructura definida en SQL Server.
Imagen 20. Definición de los atributos de la clase Cliente para su
integración con Entity Framework Fuente: elaboración propia a partir de Visual Studio 2026 Community
Esta clase constituye el modelo de datos del sistema y permite que Entity Framework actúe como un Object Relational Mapper (ORM), definiendo la estructura que será utilizada para generar la tabla Cliente en la base de datos SQL Server mediante el uso de migraciones. De este modo, la correspondencia entre la clase Cliente en la aplicación WPF y la estructura de la base de datos se mantiene de forma automática, permitiendo que la aplicación manipule la información de los clientes utilizando objetos en C#, sin necesidad de trabajar directamente con sentencias SQL. Una vez definido el modelo de datos, se procede a crear la capa de acceso a datos, la cual será responsable de establecer la conexión entre el proyecto desarrollado en Visual Studio y el motor de base de datos SQL Server. Código para DG: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text; namespace GestionClientesWPF.Models { public class Cliente { [Key] public int IdCliente { get; set; } public string Nombre { get; set; } public string Correo { get; set; } public string Telefono { get; set; } } }
Para ello, se crea una carpeta específica dentro del proyecto destinada a contener las clases que gestionan la comunicación con la base de datos a través de Entity Framework, favoreciendo una arquitectura más ordenada y mantenible. En primer lugar, se debe hacer clic derecho sobre el proyecto GestionClientesWPF y seleccionar la opción para crear una nueva carpeta, la cual se denominará Data. Una vez creada la carpeta Data, se debe agregar un nuevo archivo de tipo Clase, el cual contendrá la configuración necesaria para la conexión a la base de datos mediante Entity Framework.
Imagen 21. Creación de la carpeta Data dentro del proyecto GestionClientesWPF (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 22. Opción para agregar una nueva clase dentro de la carpeta Data (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
La clase creada deberá llamarse AppDbContext, ya que esta representará el contexto de la base de datos y será la encargada de administrar la conexión entre la aplicación WPF y SQL Server. Al finalizar este paso, la organización del proyecto debe reflejar claramente la separación entre el modelo de datos y la capa de acceso a datos, mejorando la estructura y mantenibilidad del sistema.
Imagen 23. Asignación del nombre AppDbContext a la clase creada (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 24. Organización de carpetas y archivos del proyecto con las
carpetas Models y Data Fuente: elaboración propia a partir de Visual Studio 2026 Community
Una vez creada la clase AppDbContext, Visual Studio genera automáticamente una estructura básica de clase. Esta clase será modificada para heredar de DbContext, permitiendo a Entity Framework gestionar la conexión y las operaciones sobre la base de datos. Posteriormente, se debe programar el código que define el contexto de la base de datos. En este código se establece el uso de la cadena de conexión definida en el archivo de configuración y se declara el conjunto de entidades que representan las tablas de la base de datos. En este caso, se define un DbSet
Imagen 25. Estructura inicial de la clase AppDbContext.cs (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 26. Implementación del contexto de base de datos
AppDbContext con Entity Framework Fuente: elaboración propia a partir de Visual Studio 2026 Community
Esta clase permite que Entity Framework actúe como un ORM, gestionando la comunicación con SQL Server y traduciendo las operaciones realizadas en C# en instrucciones SQL ejecutables por la base de datos. Para completar la configuración de la conexión, es necesario definir la cadena de conexión que será utilizada por Entity Framework. Para ello, se debe agregar un nuevo elemento al proyecto GestionClientesWPF. Dentro del listado de elementos disponibles, se debe seleccionar el tipo Archivo de configuración de aplicaciones, el cual permitirá almacenar los parámetros de conexión a la base de datos. Código para DG: public class AppDbContext : DbContext { public AppDbContext(): base(“name=ConexionDB”) { } public DbSet
Imagen 27. Opción para agregar un nuevo elemento al proyecto (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
El archivo creado deberá llamarse App.config, ya que este archivo es utilizado por las aplicaciones WPF para centralizar configuraciones del sistema, como cadenas de conexión y otros parámetros de ejecución. Una vez agregado, el archivo App.config debe aparecer dentro de la estructura del proyecto, indicando que se encuentra listo para ser configurado.
Imagen 28. Selección del tipo de archivo de configuración de aplicaciones (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 29. Creación del archivo App.config en el proyecto (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Finalmente, se debe programar la cadena de conexión dentro del archivo App.config, indicando los datos del servidor SQL Server, el nombre de la base de datos y el proveedor de datos. Esta cadena de conexión será utilizada por la clase AppDbContext para establecer la comunicación con la base de datos. Código para DG:
Imagen 30. Archivo App.config creado y visible en el Explorador de soluciones (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 31. Definición de la cadena de conexión en el archivo App.config (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Con esta configuración, la aplicación WPF queda correctamente preparada para conectarse a la base de datos GestionClientesDB mediante Entity Framework, permitiendo la ejecución de operaciones CRUD de forma estructurada y segura. Una vez configurados correctamente los componentes del proyecto, se procede a regresar a la ventana principal de la aplicación, correspondiente al archivo MainWindow.xaml, donde se programará el diseño de la interfaz gráfica que permitirá la interacción del usuario con el sistema. En este archivo se define la estructura visual de la aplicación utilizando el lenguaje XAML, el cual permite organizar los controles gráficos de manera declarativa. A continuación, se programa el diseño de la ventana principal, incorporando etiquetas, cuadros de texto, botones y una tabla para la visualización de datos.
Imagen 32. Vista inicial del archivo MainWindow.xaml en Visual Studio (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Código para DG:
Imagen 33. Definición del diseño de la interfaz gráfica en el archivo MainWindow.xaml (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
<Grid.RowDefinitions>
Al cambiar al modo Diseño de Visual Studio, la interfaz gráfica debería visualizarse de la siguiente forma. En esta etapa, es importante considerar que la aplicación aún no debe ejecutarse, ya que los eventos asociados a los botones todavía no han sido programados, lo que podría provocar excepciones durante la ejecución.
Imagen 34. Visualización del diseño de la interfaz gráfica en el diseñador WPF (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Para continuar, se procede a programar la lógica de la interfaz gráfica en C#. Para ello, se debe acceder al archivo MainWindow.xaml.cs, el cual contiene el código asociado a los eventos definidos en el diseño XAML. El archivo debe presentar la estructura básica de una clase parcial que hereda de Window, la cual permite vincular el código C# con la interfaz gráfica definida en XAML. A continuación, se implementa la lógica necesaria para gestionar las operaciones CRUD (crear, leer, modificar y eliminar) utilizando Entity Framework, conectando la interfaz gráfica con la base de datos SQL Server.
Imagen 36. Estructura inicial del archivo MainWindow.xaml.cs (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 35. Acceso al archivo MainWindow.xaml.cs desde el Explorador de soluciones (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 37. Implementación de la lógica de la ventana principal en C# (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
// Importa las clases base para trabajar con ventanas WPF using System.Windows; // Importa controles visuales como Button, TextBox, DataGrid, etc. using System.Windows.Controls; // Importa el contexto de base de datos configurado con Entity Framework using GestionClientesWPF.Data; // Importa el modelo Cliente que representa la tabla Clientes using GestionClientesWPF.Models; // Define el espacio de nombres del proyecto namespace GestionClientesWPF { // Clase principal de la ventana, hereda de Window (WPF) public partial class MainWindow : Window { // Se crea una instancia del contexto de Entity Framework // Este objeto permite interactuar con la base de datos AppDbContext context = new AppDbContext(); // Constructor de la ventana principal public MainWindow() { // Inicializa los componentes gráficos definidos en el XAML InitializeComponent(); // Carga los clientes desde la base de datos al iniciar la aplicación CargarClientes(); } // READ → SELECT // Método que obtiene todos los clientes desde la base de datos Código para DG:
private void CargarClientes() { // Asigna la lista de clientes al DataGrid // ToList() ejecuta la consulta contra la base de datos dgClientes.ItemsSource = context.Clientes.ToList(); } // Evento que se ejecuta cuando el usuario selecciona una fila del DataGrid private void dgClientes_SelectionChanged(object sender, SelectionChangedEventArgs e) { // Obtiene el objeto Cliente seleccionado en el DataGrid Cliente cliente = dgClientes.SelectedItem as Cliente; // Verifica que exista un cliente seleccionado if (cliente != null) { // Muestra el ID del cliente en el TextBox (solo lectura) txtId.Text = cliente.IdCliente.ToString(); // Muestra el nombre del cliente txtNombre.Text = cliente.Nombre; // Muestra el correo del cliente txtCorreo.Text = cliente.Correo; // Muestra el teléfono del cliente txtTelefono.Text = cliente.Telefono; } } // CREATE → INSERT
// Evento que se ejecuta al presionar el botón Guardar private void BtnGuardar_Click(object sender, RoutedEventArgs e) { // Se crea un nuevo objeto Cliente con los datos ingresados Cliente cliente = new Cliente { // Asigna el nombre desde el TextBox Nombre = txtNombre.Text, // Asigna el correo desde el TextBox Correo = txtCorreo.Text, // Asigna el teléfono desde el TextBox Telefono = txtTelefono.Text }; // Agrega el nuevo cliente al contexto de Entity Framework context.Clientes.Add(cliente); // Guarda los cambios en la base de datos context.SaveChanges(); // Recarga el DataGrid para mostrar el nuevo registro CargarClientes(); // Limpia los campos del formulario LimpiarCampos(); // Muestra mensaje de confirmación MessageBox.Show(“Cliente guardado correctamente”); } // UPDATE → MODIFY // Evento que se ejecuta al presionar el botón Modificar private void BtnModificar_Click(object sender, RoutedEventArgs e)
{ // Obtiene el cliente seleccionado en el DataGrid Cliente cliente = dgClientes.SelectedItem as Cliente; // Verifica que exista un cliente seleccionado if (cliente != null) { // Actualiza el nombre del cliente cliente.Nombre = txtNombre.Text; // Actualiza el correo del cliente cliente.Correo = txtCorreo.Text; // Actualiza el teléfono del cliente cliente.Telefono = txtTelefono.Text; // Guarda los cambios en la base de datos context.SaveChanges(); // Recarga los datos en el DataGrid CargarClientes(); // Limpia los campos del formulario LimpiarCampos(); // Muestra mensaje de confirmación MessageBox.Show(“Cliente modificado correctamente”); } else { // Mensaje si no se seleccionó ningún cliente MessageBox.Show(“Seleccione un cliente de la tabla”); } }
// DELETE → REMOVE // Evento que se ejecuta al presionar el botón Eliminar private void BtnEliminar_Click(object sender, RoutedEventArgs e) { // Obtiene el cliente seleccionado en el DataGrid Cliente cliente = dgClientes.SelectedItem as Cliente; // Verifica que exista un cliente seleccionado if (cliente != null) { // Muestra un mensaje de confirmación antes de eliminar MessageBoxResult confirmacion = MessageBox.Show( “¿Está seguro que desea eliminar este cliente?”, “Confirmación”, MessageBoxButton.YesNo, MessageBoxImage.Warning ); // Si el usuario confirma la eliminación if (confirmacion == MessageBoxResult.Yes) { // Marca el cliente para ser eliminado context.Clientes.Remove(cliente); // Ejecuta la eliminación en la base de datos context.SaveChanges(); // Recarga el DataGrid CargarClientes(); // Limpia los campos del formulario LimpiarCampos(); // Muestra mensaje de confirmación MessageBox.Show(“Cliente eliminado correctamente”);
} } else { // Mensaje si no se seleccionó ningún cliente MessageBox.Show(“Seleccione un cliente de la tabla”); } } // Método auxiliar que limpia los campos del formulario private void LimpiarCampos() { // Limpia el TextBox del ID txtId.Text = “”; // Limpia el TextBox del nombre txtNombre.Text = “”; // Limpia el TextBox del correo txtCorreo.Text = “”; // Limpia el TextBox del teléfono txtTelefono.Text = “”; // Quita la selección actual del DataGrid dgClientes.SelectedItem = null; } } }
Finalmente, se procede a ejecutar la aplicación para comprobar el correcto funcionamiento de las funcionalidades implementadas. Al ejecutarse, se puede observar la interfaz gráfica junto con la tabla ubicada en la parte inferior de la ventana, la cual permite visualizar los registros almacenados en la base de datos y realizar operaciones CRUD sobre ellos. Además, al revisar el motor de base de datos desde DBeaver, es posible verificar que la tabla correspondiente ha sido creada automáticamente mediante el proceso de migraciones de Entity Framework, confirmando la correcta integración entre la aplicación WPF, Entity Framework y SQL Server. Al iniciar la aplicación, se puede verificar que el proceso de migración ha creado automáticamente las tablas correspondientes en la base de datos, incluyendo la tabla Clientes y la tabla interna __MigrationHistory, la cual es utilizada por Entity Framework para el control de versiones del esquema de la base de datos.
Imagen 38. Aplicación WPF en ejecución con la funcionalidad de gestión de clientes (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Para comprobar la operación de registro de datos, se ingresa un nuevo cliente desde la interfaz gráfica de la aplicación. En este proceso, el usuario debe completar únicamente los campos Nombre, Correo electrónico y Teléfono, ya que el campo IdCliente se genera automáticamente en la base de datos mediante un identificador autoincremental. Al presionar el botón Guardar, la información es almacenada correctamente y se muestra un mensaje de confirmación. De manera simultánea, el nuevo registro se visualiza en la tabla ubicada en la parte inferior de la aplicación, lo que confirma la ejecución exitosa de la operación INSERT a través de Entity Framework.
Imagen 39. Tablas creadas en la Base de Datos (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 40. Ingreso de datos de un nuevo cliente desde la aplicación WPF (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Para validar que los datos fueron persistidos correctamente, se consulta la base de datos desde el gestor DBeaver utilizando una sentencia SELECT, comprobando que el registro ingresado desde la aplicación se encuentra almacenado en la tabla Clientes. A continuación, se verifica la operación de modificación de datos. Para ello, se selecciona un registro desde la tabla de la aplicación, lo que provoca que la información del cliente sea cargada automáticamente en los campos de texto. Posteriormente, se modifica uno o más valores y se presiona el botón Modificar, actualizando los datos tanto en la interfaz como en la base de datos.
Imagen 41. Confirmación del registro del cliente y visualización en la tabla de la aplicación (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 42. Visualización del registro almacenado en la base de datos SQL Server (Fuente: elaboración propia a partir de Dbeaver)
Tras realizar la modificación del Telefono, se muestra un mensaje de confirmación y se observa el cambio reflejado inmediatamente en la tabla de la aplicación. De igual forma, al consultar nuevamente la base de datos desde DBeaver, se verifica que la información ha sido actualizada correctamente, confirmando la correcta ejecución de la operación UPDATE mediante Entity Framework.
Imagen 43. Selección de un cliente y modificación de sus datos desde la aplicación (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 44. Confirmación de la modificación del cliente en la aplicación (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Finalmente, se valida la operación de eliminación de datos. Para ello, se selecciona un cliente desde la tabla y se presiona el botón Eliminar. El sistema muestra un mensaje de confirmación con el fin de evitar eliminaciones accidentales. Al confirmar la acción, el registro es eliminado de la aplicación y de la base de datos de forma permanente.
Imagen 45. Registro modificado correctamente en la base de datos SQL Server (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 46. Selección del cliente a eliminar desde la aplicación (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Una vez completado el proceso, se observa que el cliente ya no se encuentra disponible en la tabla de la aplicación. Asimismo, al consultar nuevamente la base de datos en DBeaver, se confirma que el registro ha sido eliminado correctamente, validando la ejecución de la operación DELETE a través de Entity Framework.
Imagen 47. Mensaje de confirmación de eliminación del cliente (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Imagen 48. Tabla de la aplicación tras la eliminación del registro (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
Con el siguiente caso práctico se pudo evidenciar cómo es posible desarrollar una aplicación de escritorio funcional utilizando C# y WPF, integrando una base de datos relacional mediante Entity Framework y SQL Server. A través de este ejercicio se aplicaron conceptos fundamentales como el uso de un ORM, la separación de responsabilidades, el diseño de interfaces gráficas y la implementación de operaciones CRUD, permitiendo manipular información persistente de forma segura y estructurada. Este tipo de desarrollo refleja un escenario común en aplicaciones reales, donde la correcta interacción entre la interfaz, la lógica de negocio y la base de datos resulta esencial para construir soluciones confiables, mantenibles y orientadas a la gestión eficiente de la información.
Imagen 49. Verificación de la eliminación del registro en la base de datos SQL Server (Fuente: elaboración propia a partir de Visual Studio 2026 Community)
El desarrollo del presente caso práctico permitió aplicar de manera integral los conocimientos fundamentales de programación en C# dentro de un entorno de aplicaciones con interfaces gráficas WPF, abordando un problema de mediana complejidad relacionado con la gestión de información persistente. A través de la implementación de Entity Framework como herramienta ORM, se logró establecer una comunicación eficiente entre la aplicación y el motor de base de datos SQL Server, eliminando la necesidad de trabajar directamente con sentencias SQL en la lógica de la aplicación. Durante el proceso, se diseñó una interfaz gráfica funcional e intuitiva, capaz de interactuar con la base de datos mediante operaciones CRUD (crear, leer, modificar y eliminar), las cuales fueron ejecutadas utilizando métodos propios de Entity Framework como Add, ToList, SaveChanges y Remove. Estas operaciones permitieron validar el correcto flujo de datos entre la capa de presentación, la capa de acceso a datos y la base de datos relacional. Asimismo, el uso de migraciones facilitó la creación y mantenimiento del esquema de la base de datos, asegurando la sincronización entre los modelos definidos en C# y las estructuras físicas en SQL Server. Este enfoque demuestra una práctica ampliamente utilizada en proyectos reales de desarrollo de software, donde la escalabilidad, el mantenimiento y la coherencia del sistema resultan aspectos clave. En conclusión, el proyecto desarrollado evidencia cómo la combinación de WPF, Entity Framework y SQL Server permite construir soluciones robustas, organizadas y alineadas con estándares profesionales, cumpliendo plenamente con el aprendizaje esperado de resolver problemas de mediana complejidad mediante el lenguaje de programación C# en aplicaciones con interfaces gráficas.
💡 Conclusión
-
Microsoft. (2024). Getting started with Entity Framework 6 – Entity Framework 6 documentation. Microsoft Learn.
-
Microsoft. (s. f.). Create a simple data application with WPF and Entity Framework 6. Microsoft Learn.
🚀 Potencia tus proyectos tecnológicos con Proyecto Luna
En Proyecto Luna desarrollamos arquitectura de software de alto rendimiento, optimización de bases de datos críticas y soluciones aplicadas de inteligencia artificial y automatización para empresas y profesionales.
- 💼 Soluciones de ingeniería: Conoce nuestras capacidades y casos de estudio en proyectoluna.com/work/.
- 🛡️ Seguridad y auditoría: Orientación técnica y respuesta ante incidentes en ¿Te han hackeado?.
- 📩 Contacto directo: Escríbenos a través de nuestro formulario de contacto o a
contacto@proyectoluna.com.
📚 Fuentes y lecturas recomendadas
- https://learn.microsoft.com/en-us/ef/ef6/get-started https://learn.microsoft.com/en-us/visualstudio/data-tools/create-a-simpl e-data-application-with-wpf-and-entity-framework-6






