Para mejorar la eficiencia y evitar un tedioso ingreso manual, podemos precargar datos en nuestra base de datos sin tenerla completamente construida. Este enfoque permite integrar datos de ejemplo desde el inicio del desarrollo. Aquí te explico cómo hacerlo usando el contexto de tu aplicación.
¿Qué es el método Onmodelcreating?
El método OnModelCreating en Entity Framework Core se utiliza para configurar el modelo a medida que se construye. Este método se sobrescribe en nuestra clase que hereda de DbContext y no devuelve un valor, es de tipo void.
protectedoverridevoidOnModelCreating(ModelBuilder modelBuilder){// Configuración de datos aquí}
¿Cómo precargar entidades con datos iniciales?
Para precargar entidades, usamos el método HasData dentro de OnModelCreating. Este método permite insertar datos a nuestra base de datos sólo si no existe previamente.
Agregar una categoría:
Aquí, creamos una nueva instancia de la entidad Category y la llenamos con los datos necesarios. Esta estructura se repite para otras entidades, como bodegas y productos.
modelBuilder.Entity<Category>().HasData(newCategory{ CategoryId = Guid.NewGuid(),// Generación de un nuevo Guid Name ="Aseo Hogar"});
Agregar múltiples categorías:
Puedes definir múltiples instancias añadiendo más objetos dentro del método HasData, separados por comas.
modelBuilder.Entity<Category>().HasData(newCategory{ CategoryId = Guid.NewGuid(), Name ="Aseo Hogar"},newCategory{ CategoryId = Guid.NewGuid(), Name ="Electrodomésticos"}// Agregar más categorías según sea necesario);
¿Cómo trabajar con entidades como bodegas?
El mismo proceso se aplica para otras entidades como Warehouse. Se usa el Guid para crear identificadores únicos. Aquí tienes un ejemplo de cómo definir una bodega.
modelBuilder.Entity<Warehouse>().HasData(newWarehouse{ WarehouseId = Guid.NewGuid(), Name ="Bodega Central", Address ="Calle 8 con 23"},newWarehouse{ WarehouseId = Guid.NewGuid(), Name ="Bodega Norte", Address ="Calle Norte con Occidente"});
¿Cómo finalizar la creación de la base de datos?
Después de configurar todos nuestros datos iniciales, el siguiente paso es aplicar las migraciones y crear nuestra base de datos. Este proceso asegura que las tablas no solo existan, sino que también se poblen con los datos definidos.
Aplicar migraciones y actualizar la base de datos
Agregar una migración:
Se crea una migración utilizando el comando en la consola del Package Manager:
Add-Migration InitialCreate
Una vez creada, se ejecuta una actualización para aplicar estos cambios:
Update-Database
Verificar y poblar la base de datos:
Luego de ejecutar los comandos, puedes verificar si la base de datos y sus tablas se han creado usando herramientas como SQL Server Management Studio. Asegúrate de refrescar la vista de las bases de datos para comprobar la existencia de las nuevas tablas y datos.
Con estos pasos, no solo hemos creado una base de datos robusta usando Entity Framework Core, sino también hemos optimizado el flujo de desarrollo al precargar datos esenciales. Sigue explorando y mantente motivado, ya que estas habilidades son fundamentales para tu avance en el desarrollo de software.
Hola compañeros llegue a tener un problema, les comparto esto por si les llega a suceder.
Al momento de ejecutar el comando "update-database", me apareció este error:
_Error Number:8152,State:10,Class:16
String or binary data would be truncated.
The statement has been terminated. _
Este error se presento debido a que los atributos ProductId de la entidad ProductEntity y WarehouseId de la entidad WarehouseEntity tiene establecido una longitud de caracteres menor, a la que se esta tratando de ingresar.
Para solucionar esto pueden agregar una longitud menor a los caracteres que ingresen, o pueden modificar las "DataAnnotations" para que acepten un mayor numero de caracteres, una vez realizado alguna de las dos acciones lo siguiente es ejecutar los siguientes comandos:
add-migration Mensajeupdate-database
Esperoq les sea de ayuda.
Saludos 👋.
La manera en que modifiqué las entidades fue
[StringLength(maximumLength:50)]
public string WarehouseId { get; set; }
Con esto digo que puedo tener hasta 50 caracteres en el Id.
El StringLenght hay que revisar para que soporte la cantidad de caracteres que le ponemos al momento de poblar con data.
Por si quieren indicar que el campo Id de una tabla es auto incremental, deben incluir este data annotations antes de la definición del campo:
publicclassNameEntity{[Key][DatabaseGenerated(DatabaseGeneratedOption.Identity)]public int campoId { get; set;}}
Hola, en el modelBuilder, al ser identity integer, como lo aplicaste? Gracias
Si de pronto les sale el error secuencia de escape no reconocida, en la cadena de conexión al motor de base de datos, si en medio de una cadena tienen el carácter , agreguen otro \
ejemplo:
Antes:
options.UseSqlServer("Server=DESKTOP-xxxx\SQLEXPRESS; Database=InventoryDb; User Id=xxxxx\xxxx; Password=xxxx");
Después:
options.UseSqlServer("Server=DESKTOP-xxxx\\SQLEXPRESS; Database=InventoryDb; User Id=xxxxx\\xxxx; Password=xxxx");
Gracias!!!!!!!!!!!!
Excelente curso hasta el momento todo bastante claro, muy interesante todo lo que ayudan los DataAnnotations. No se si alguien sabe como personalizar un id ejemplo para todas las categorías colocar CATEG01, CATEG02, CATEG03 y así con las otras tablas
Con base a esta clase y en el caso de Visual Code adjunto la siguiente información:
$ dotnet ef database update {
Va a comprobar si la base de datos no existe las construye desde cero y le
agrega la información si ya existe la base de datos comprueba las migraciones
mira que actualizaciones hay y las registra
}
En caso de que no cargue la información podemos volver a ejecutar los ultimos comandos{
dotnet ef Migrations add FirstMigration
dotnet ef database update
}
Si se quiere definir que un campo tiene un índice único, en el archivo InventaryContext.cs en el método OnModelCreating se debe incluir la siguiente línea para cada campo al que se le desea aplicar:
lo máximo esta explicación, muy detallada para lograr el objetivo.
Como puedo saber cual es la contraseña de mi SQLServer? Gracias
En caso de que tengan un error en el "ConnectionString" del siguiente tipo :
"A connection was successfully established with the server, but then an error occurred during the login process. (provider: SSL Provider, error: 0 - La cadena de certificación fue emitida por una entidad en la que no se confía.)"
Pueden solucionarlo agregando lo siguiente a su string de conexión:
uff algo magico crear las tablas de SqlServer desde C# en Visual Studio; normalmente lo hacia manualmente con codigo SQL directamente desde el Managament Studio.
Excelente curso, ojala este mismo profesor actualice los cursos de C#
Buenos días, Me sale el siguiente mensaje:
Could not load assembly 'DataAccess'. Ensure it is referenced by the startup project 'Inventory'. En el momento de ejecutar PM> update-database
Hector, no había podido revisar los mensajes, no sé si ya lo solucionaste, por si acaso te comento que teniendo en cuenta que el proceso de manejo y creación de la base de datos estámos utilizando EntityFramework que corre en el proyecto DataAccess, es necesario que para actualizar la base de datos pongas como proyecto de inicio en el VisualStudio (Mirate el video anterior el 20 en el minuto 8 aproximadamente)
Que debo hacer en el caso de que me aparece este error:
No database provider has been configured for this DbContext. A provider can be configured by overriding the DbContext.OnConfiguring method or by using AddDbContext on the application service provider. If AddDbContext is used, then also ensure that your DbContext type accepts a DbContextOptions<TContext> object in its constructor and passes it to the base constructor for DbContext.
Hola @gilsaint24
exactamente en que punto de tu codigo sucede esto, podrias mostrarnos como lo tienes hecho?
Bueno con el fin de ayudar, quiere compartir una guia o articulos que me ayudaron demasiado, para este capítulo en particular este articulo nos enseña a realizar siembra de datos a través de archivos de configuración, qué beneficios siento nos trae?, inicialmente y como uno de los más grandes nos permite dejar el código contenido dentro de nuestro OnModelCreating mucho más limpio y nos permite crear archivos de configuración para nuestras entidades, espero les ayude
Hola, alguien hizo con identity int para que me diga como aplicó en el modelBuilder ? Gracias
update-database crea/actualiza la base de datos apartir de mis modelos, pero.. y si hacen cambios en la db directamente, como traigo esos cambios a mi db? sin tener que hacerlo manual claro.
Hola, Quizás es un poco tarde pero puede servirle a alguien que vea la pregunta, creo que te referias a traer esos cambios a tus modelos, la manera mas fácil y sin tanta complicación es hacer rescaffolding utilizando database-first y agregando un force
Ojo: Esto puede traer inconvenientes como que sus modelos no queden exactamente igual, Por ejemplo puede convertir listas en IEnumerable y Enum en int y cosas asi por el estilo pero siempre puedes arreglarlo facilmente despues.
dotnet ef dbcontext scaffold "Server=(localdb)\v11.0;Database=MyDatabase;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models -f
Ojo!, Reemplace el conection string y el directorio en donde esta su carpeta de modelos. Lo que hara esto es reemplazar sus modelos existentes por los creados desde EF Database first
Alguien tendra este error ?
ErrorNumber:18456,State:1,Class:14Login failed for user 'admin'.
¿Cuáles son las ventajas de usar un guid string ante un id autoincremental generado por la base de datos? en lo particular una ventaja que le veo es que con el guid puedes verificar que en verdad se creó el registro, pero con autoincremental no, o al menos no con una consulta básica.
Muchas gracias Luis, me sirvió mucho tu comentario, muy buen video, en lo personal yo he trabajado mas con las autoincrementales, pero la verdad veo mejor opción las guid porque ya conoces el identificador y hay menos problemas de colisiones por transacciones al mismo tiempo, claro que una buena práctica sería verificar que no exista el guid antes de realizar un insert.
Al ejecutar los comandos en el "Package Manager Console", surgieron probelmas con las politicas de powerSell de mi maquina. Para poder ejecutar las migraciones, desde la consola y parado sobre la carpeta "DataAccess" creada en este proyecto, puedes usar los siguientes comandos:
dotnet ef migrations add Init
dotnet ef database update