Science And Technology">
SQL Server Net Core
SQL Server Net Core
SQL Server Net Core
Espacio para instalación aproximadamente 6.5GB el instalador es de 259MB para el motor de Base de Dato MSSqlServer
Express Edition.
Ralemente de nada sirve construir toda una aplicación si no tenemos una entidad que se encargue de almacenar toda la
“DATA” de nuestro sistema.
Una base de datos es una colección de información que se organiza de manera que podamos acceder, administrar y
actualizar fácilmente la “DATA” dentro de ella.
Algunas veces son conocidos como DBMS (Database Management System) – Sistema de Administracion de Base de
Datos y existen diferentes gestores, administradores de base de datos, en el curso trabajaremos el MS SqlServer,
también existe el MySQL, Oracle, PostgresQL.
En conclusión, las herramientas de software de Base de Datos se utilizan principalmente para almacenar, modificar,
extraer y buscar información dentro de una Base de Datos.
Existen diferentes tipos de base de datos de objetos como MongoDB, FireBase, Cosmos de Azure, también base de datos
relacionales como MySQL, PostgreSQL, Oracle o MSSQL Server
Una base de datos relacional es un conjunto de tablas descritas formalmente desde las cuales se puede acceder a los
datos o re-ensamblarlo de muchas maneras diferentes.
La interfaz de programación de usuario y aplicación estándar de una base de datos relaciona es el lenguaje de consulta
estructurado – SQL (Structured Query Language).
Este es el lenguaje que se utiliza para poder crear tablas, insertar datos dentro de las tablas, actualizar la DATA dentro de
las tablas, extraer la DATA insertada en las tablas.
En conclusión, para poder administrar completamente una base de datos relacional como MSSQL, Oracle, Mysql o
PostgreSQL, necesitamos conocer SQL para poder crear nuestras entidades, las relaciones entre estas entidades y poder
ingresar, actualizar o extraer la información que deseamos.
Nosotros conocemos lenguajes OO como Java y C#, entonces como hacemos para mover o representar dentro de mi
código (C#, java) estas estructuras de nuestra base de datos, porque recordemos que hay una gran diferencia entre un
modelo relacional como MSSQL Server con un modelo OO (java, c# o Node.js)
Diferencias entre Relacional vs Objetos
MSSqlServer para poder manejar las transacciones (creación, inserción o actualización de la DATA) utiliza el lenguaje SQL
mientras que en .NET Core para realizar estas mismas tareas utiliza el lenguaje C#.
Usualmente al programar OO se usan patrones de diseño para poder representar un mejor modelo OO.
Dentro MSSqlServer el principal repositorio para almacenar la DATA es una TABLA, mientras para un lenguaje OO el
principal elemento de representación es una CLASE.
Para poder identificar un valor único dentro de una tabla es a través de llaves primarias, en .Net Core es instanciar una
clase para poder tener un valor único.
Las relaciones entre tablas dentro de MSSqlServer se llevan a cabo por claves foráneas en .Net Core se lleva a cabo a
través de referencia de atributos dentro de una clase.
Para poder extraer la DATA dentro de una BD usamos condiciones lógicas incorporadas dentro del lenguaje SQL, una de
las más famosas es la sentencia WHERE. En Net Core se utiliza una librería llamado Link, permite trabajar y condicionar
la lógica de un conjunto de datos.
¿Qué necesitamos crear para poder mover cierta DATA de una tabla de MSSqlServer y pasarla a una clase .Net Core?
Para realizar esto necesitamos implementar el Entity Framework Core, que es una librería que permite acceder a base
de datos, está diseñada como un ORM (Object Relational Mapper) mapeador de objetos relacional, haciendo un mapeo
entre los dos mundos el RELACIONAL y el de OBJETOS.
Ejemplo:
Tenemos una tabla Curso que tiene como llave primaria CursoID compuesto de otras columnas Titulo, Descripcion,
FechaPublicacion y FotoPortada, tenemos que crear dentro de Entity Framework una clase que se va a llamar Curso con
las propiedades (CursoID, Titulo, Descripcion, FechaPublicacion y FotoPortada) como se nota tiene los mismos nombres.
Nos aparecen varios nodos (árbol de subdirectorios del motor de base de datos) y elegimos Databases (doble click) nos
desglosa un par de carpeta de soporte, se recomienda no tocarlas para nada, sobre Databases botón derecho y elegimos
New Database …
Luego nos despliega una pantalla donde tenemos que colocar un nombre a nuestra base de datos como ejemplo
colocaremos “CursosOnline” y le damos click en OK y nos creará la base de datos.
Dentro de la base de datos creada al desplegar veremos varias carpetas, donde generalmente el DBA (DabaBase
Administrator) es el que se encarga de administrarlas, en nuestro caso solo nos interesara la sección de Tables (Tablas) y
Programmability (Programación).
En la sección Tables, como su nombre indica crearemos todas las tablas y la relación que tendrán entre ellas,
aquí también se crean los triggers.
En la sección Programmability, para crear procedimientos almacenados, funciones, etc.
En el ejemplo que haremos será que el Entity Framwork Core se encargue de toda la lógica de programación, de
implementar las business rule (las reglas de negocio).
Donde:
CursoId entero
Titulo nvarchar(500)
Descripcion nvarchar(1000)
FechaPublicacion datetime
FotoPortada varbinary(1000)
Ahora debemos indicar cual campo será la llave primaria, click sobre CursoId, click derecho y elegimos Set Primary Key
Ahora, necesitamos que CursoID sea autogenerado, esto significa que automáticamente al registrar un Curso se genere
un nuevo número de Id para el campo CursoID, para que esto sea automático debemos hacer lo siguiente,
seleccionamos CursoID para tener las propiedades de la columna y modificamos como esta en la imagen:
Todos estos cambios los guardamos, hacindo click Control-S o en el icono del Disket, luego escribimos el nombre de la
tabla que va a ser Curso.
Para verificar la creación de la tabla CURSO tenemos que hacer un Refresh sobre Tables:
Si queremos ingresar datos a la tabla, simplemente damos click derecho sobre dbo.Curso y luego elegimos la opción Edit
Top 200 Rows, agregamos los siguiente datos
En foto de portada lo dejamos por el momento en Null y para que se grabe presionamos la tecla TAB.
Si queremos ver los datos dentro de la tabla creada:
CREAR UNA SOLUCION Y UN PROYECTO ASP.NET CORE
Ahora vamos a crear un proyecto para leer los datos en la base de datos.
1) Abrir visual studio 2019 y elegir Continuar sin codigo 2)Se abrirá un proyecto vacio e ir a la opción File o
Archivo
7) Haciendo click derecho en la solución para crear un 8) Agregar un proyecto de consola llamado LeerData
proyecto
10) y quedara de la siguiente manera:
El siguiente diagrama nos ayudará a comprender paso a paso como Entity Framework puede realizar transacciones a una
base de datos MS SqlServer.
Primero, el comando que inicia toda transacción en nuestro modelo es AsNoTracking(), este método lo primero que
hace es buscar entidades dentro de nuestro proyecto que a futuro van a ser un Match con las tablas de MS SqlServer.
¿A que llamamos Entidad?, es una clase de tipo DotNet, esta clase para que se convierta en entidad necesita ser definida
como un tipo DbSet, en la figura lo que hace AsNoTracking() es buscar a la clase Curso y también se está definiendo
como DbSet, en base a esta entidad ejecuta un comando invocando al objeto a la librería Link, lo que hace la librería
Link es crear una consulta en código SQL es decir traduce el código C# y lo convierte en un código SQL. Y este código es
el que envía al servidor de base de datos. Lo que hace luego MS SqlServer es devolver los datos de la consulta que
estamos haciendo y lo que hace EntityFramework es tomar esos datos que están en formato relacional y lo convierte a
un modelo de objetos, lo convierte en un arreglo de objetos Curso. Ahora teniendo un arreglo de tipo objeto Curso ya
podemos tomar esa data y trabajar desde C#.
Ahora agregamos los siguientes paquetes por Nuget, con la última versión en este momento la 3.14
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
Crear cadena de conexión a la Base de Datos
Realizamos una conexión al servidor MSSqlServer desde Visual studio, eligiendo el Explorador de Servidores y agregando
nuestra base de datos como se ven en la figura:
Ahora ya tenemos configurada nuestra conexión a la base de datos y también la definición del elemento que queremos
conectarnos la tabla Curso que esta siendo representada por Curso en C#.
Mapeando una Tabla en SqlServer con EntityFramework
¿Por que usamos el método AsNoTracking()? Permite o evita almacenar en el cache de la transacción la Data que está
devolviendo el SqlServer, pedimos la Data e inmediatamente entregue, no le indicamos que la guarde en memoria en el
EntityFramework.
Cada una de las tablas tiene una lógica interna, pero de nada sirve si es que estas tablas no pueden relacionarse entre sí
y compartir información entre ellas entonces. ¿Cómo haremos para crear esas relaciones entre tablas?
En el modelo relacional lo podemos hacer por:
La clave primaria, se caracteriza por representar de manera única cada fila de una tabla.
La clave foránea, es un campo que señala la clave primaria de otra tabla. El propósito de la clave foránea es
asegurar la integridad referencial de los datos por ejemplo si vemos la tabla Comentario tiene como clave
foránea CursoId de la tabla Cursos.
1. La relación 1:1 (el registro de una tabla se asocia a uno y solo un registro de otra tabla, ejemplo Precio – Curso
Ahora en el Program.cs, haremos una consulta para ver la relación entre Curso y Precio:
Como verán Include sirve para hacer la relación con la Clase Precio
La relación Uno a Muchos ocurre cuando una tabla “A” puede enlazar múltiples registros en una tabla “B”, pero la tabla
“B” puede tener solo un registro que corresponda.
En la imagen tenemos la Tabla Curso, un curso puede tener muchos Comentarios, por otro lado, un comentario puede tener solo un
curso.
Para implementar entramos a nuestro Managament SQL, para crear la tabla Comentario:
Para verificar la creación de la tabla Click con el botón derecho en la base de datos CursosOnline y hacer un Refresh.
Ahora vamos a crear el constraint (la llave foránea) lo haremos en sql server y ejecutamos el siguiente script:
ALTER TABLE Comentario ADD CONSTRAINT FK_COMENTARIO_CURSO FOREIGN KEY(CursoId) REFERENCES
Curso(CursoId)
Ahora ingresamos datos en la tabla Comentarios:
Tomar en cuenta que ahora Curso tiene una Colección de Comentarios y la tabla Comentario está relacionada con
CursoId.
Y ahora modificaremos la clase Program.cs para poder listar este tipo de relación:
3.- La relación Muchos a Muchos
La relación Muchos a Muchos ocurre cuando una Tabla “A” puede enlazar a múltiples registros en una Tabla “B” y
viceversa.
Como vemos en la imagen, un Curso puede tener muchos Instructores y a su vez un Instructor puede tener muchos
cursos, según las reglas de normalización, cuando sucede este tipo de relación muchos a muchos, lo que se debe hacer
es crear una nueva entidad que permita almacenar las relaciones que existen entre Curso e Instructor.
Instructor
CursoInstructor
Y sus relaciones correspondientes
1) Agregar los campos 2) Definir la llave primaria
3) Definir esta llave como autogenerar 4) Ctrl-S o click en el disket para guardar y dar nombre
9) Ahora vamos a crear las relaciones (clave foranea) hacemos click en New Query
ALTER TABLE CursoInstructor ADD CONSTRAINT FK_CURSO_INSTRUCTOR_CURSOID FOREIGN KEY (CursoId)
REFERENCES dbo.Curso(CursoId)
11) Ahora queremos que Nestor, Javier y Daniela sean los 12) Vemos los datos que hemos introducido
instructores del Primer curso “Curso .Net Core Entity
Framework”
13) Ahora Ana será instructor del curso de Code Clean y 14) Vemos los datos que hemos introducido
también Javier sea el instructor del curso Code Clean
El siguiente paso es crear las clases para que reconozca en Entity Framework Core.
Las propiedades public int CursoId y public int InstructorId son llaves primarias y llaves foráneas al mismo tiempo.
Que es lo que pasa, que dentro de Entity Framework debemos indicarle que no tiene una única llave primaria, sino que
tiene dos (compuesta).
También en la clase CursoDbContext debemos agregar las clases que hemos creado:
Y ahora modificaremos la clase Program.cs para poder listar este tipo de relación, vamos a crear una consulta que
retorne la relación de Cursos junto con el nombre del Instructor.
Recordemos algo que la Tabla CursoInstructor no tiene el nombre del Instructor solo tiene el Id el código del instructor,
si quisiéramos obtener el nombre lo que debemos hacer es agregar otra “inclusion” extra para que nos retorne también
la entidad instructor y de esta forma obtendremos el nombre y el apellido y los demás datos que necesitemos del
Instructor, el querey que vamos a crear comienza desde la tabla Curso.
Operaciones CRUD con .Net Core Entity Framework
El siguiente paso es representar en Enity Framework