Creando una migración
Clase 19 de 25 • Curso de Fundamentos de Entity Framework
Contenido del curso
Clase 19 de 25 • Curso de Fundamentos de Entity Framework
Contenido del curso
Platzi Team
Platzi Team
Miguel Teheran
Braian Molina
Miguel Teheran
Braian Molina
Cesar Castro
Miguel Teheran
Miguel Angel Reyes Moreno
David Cubides Enciso
Miguel Teheran
Mathías Cabrera
VICTOR CAUDILLO
Miguel Teheran
Jose Alfonso Velaides Machado
Miguel Teheran
namontealegre
lucas pace
Sebastian Torrejon Rubio
Karen Lisbeth Gelvez Lesmes
Kevin Fiorentino
Eduardo David Santiago Carrillo
Edgar Armando Gómez Cárdenas
Miguel Teheran
Franklin Gil
Miguel Teheran
Miguel Santiago Gómez Suárez
Juan Sebastian Gamba
David Dzul
Jesús Marcano
Para que se implemente las migraciones hechas al publicar el proyecto, lo logre hacer colocando el siguiente código en la clase program
using (var context = new AppDbContext(app.Configuration)) { context.Database.Migrate(); }
y el context quedo asi :
using Microsoft.EntityFrameworkCore; using WebApplication2.Models;
namespace WebApplication2.Context { public class AppDbContext : DbContext { protected readonly IConfiguration _config;
public AppDbContext(IConfiguration configuration) { _config = configuration; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(_config.GetConnectionString("Conn1")); } protected override void OnModelCreating(ModelBuilder modelBuilder) { } public DbSet<Categoria> Categorias { get; set; } public DbSet<Tarea> Tareas { get; set; } }
}
y como funciona estás migraciones cuando publicó y despliego por iis el proyecto ?
Excelente pregunta! y también aclaro varias cosas
Como seria la forma de crear migraciones sin dotnet ? 🤔 osea contemplarlo en el codigo del proyecto para que cuando se agregue un campo nuevo por ejemplo, solo deba ejecutar el proyecto. Graciasss!!!
No tienes que usar migraciones simpleme hacer el control de cambios en un repositorio con carpetas usando Scripts de SQL. luego ahces los cambios en código para que coincidan y listo. Si hay una discrepancia entre una propiedad de una clase de C# y una columna de una tabla de la BD va retornar un error.
genial, gracias por la respuesta, excelente el curso! 👍👍
Hola :) La carpeta Migrations, ¿Tiene algún manejo para su crecimiento? pues me imagino que en el día a día los archivos de esta carpeta tienden a ser miles por las actualizaciones en los modelos y la adición de migraciones Gracias !!
En teoría no deberían ser miles por que la estructura base de datos que es la mas compleja debe estar hecha antes de iniciar las migraciones. Las migraciones e van creando con cambios que van surgiendo. En los proyectos que he trabajado monoliticos se pueden tener entre 50 a 80 migraciones mas o menos y seguro creciendo pero muy poco. Para sistemas ya muy grandes no se recomienda en la actualizar crear contextos gigantes de EF sino mas bien usar arquitecturas como microservicios y separar en diferentes APIs y base de datos la lógica en este caso entonces tampoco creceria de manera descontrolada las migraciones pues el proyecto se va diviendo poco a poco.
Agregué la columna 'Puntos' a la tabla de Tarea:
namespace proyectoEF.Models; public class Tarea { public Guid TareaId {get; set;} public Guid CategoriaId {get; set;} public string Titulo {get; set;} public string Descripcion {get; set;} public Prioridad PrioridadTarea {get; set;} public DateTime FechaCreacion {get; set;} public int Puntos {get; set;} public virtual Categoria Categoria {get; set;} public string Resumen {get; set;} } public enum Prioridad { Baja, Media, Alta }
modelBuilder.Entity<Tarea>(tarea => { tarea.ToTable(("Tarea")); tarea.HasKey(key => key.TareaId); tarea.HasOne(p => p.Categoria).WithMany(p => p.Tareas).HasForeignKey(p => p.CategoriaId); tarea.Property(p => p.Titulo).IsRequired().HasMaxLength(200); tarea.Property(p => p.Descripcion); tarea.Property(p => p.PrioridadTarea); tarea.Property(p => p.FechaCreacion); tarea.Property(p => p.Puntos); tarea.Ignore(p => p.Resumen); });
Que pasa con la data que existe en la tabla, si al agregar una nueva columna dice que la elimina? perdemos la información? o se crea la columna sin afectar los cambios de la tabla?
Puedes crear nuevas columnas sin con un valor por defecto o con valor nulo sin afectar nada. También puedes eliminar columnas pero obviamente se perderian los datos
Agregué el campo Tiempo Límite a la tabla de Tarea
public class Task { //[Key] public Guid TaskId {get;set;} //[ForeignKey("CategoryId")] public Guid CategoryId {get;set;} //[Required] //[MaxLength(200)] public string? Title {get;set;} public string? Description {get;set;} public Priority PriorityTask {get;set;} public DateTime CreationDate {get;set;} public DateTime TimeLimit {get;set;} //This property will help us when we need to obtain the Category belonging to a Task public virtual Category? Category {get;set;} //[NotMapped] public string? Summary {get;set;}//This property will have the title and summary of its description. Since we don't want it to be generated in the database but only within C#, we use "NotMapped". }
modelBuilder.Entity<project_ef.Models.Task>(task => { task.ToTable("Tarea"); task.HasKey(p=> p.TaskId); task.HasOne(p=> p.Category).WithMany(p=> p.Tasks).HasForeignKey(p=> p.CategoryId); task.Property(p=> p.Title).IsRequired().HasMaxLength(200); task.Property(p=> p.Description); task.Property(p=> p.PriorityTask); task.Property(p=> p.CreationDate); task.Property(p=> p.TimeLimit); task.Ignore(p=> p.Summary); });
Yo decidi agregar el campo FechaLimite para tener un deadline de la tarea.
Me parece excelente idea, precisamente buscamos que sigan explorando para que aprendan
¿Que diferencia existe en llevar un control de versiones (GIT) y llevar un control en migraciones?
No son diferentes se complementan, Las migraciones se generan pero luego se deben subir a git y seguir con la trazabilidad. Si te refieres a crear scripts SQL + Git la diferencia esta en que en el ultimo escenario tendria que saber SQL y ademas comprar la fuente de la verdad que es tu codigo con los scripts. Con migraciones todo se hace en conjunto
dotnet add package Microsoft.EntityFrameworkCore.Design --version 6.0.3
dotnet ef migrations add Initial
dotnet ef database update
AYUDA me encuentro con un problema. El explorer de VS Code no me esta marcando en el cual de todas las migraciones está siendo utilizada, es decir, no me indica con las letras en color verde ni con la "U" a la derecha, esto es alguna configuracion de vs code o fluent api para lograr que la migracion activa se resalte?
A mi tampoco me sale, supongo que es una extension de VS Code. Creo que es alguna extension de git.
¿Cómo puedo eliminar una migración que ya ha sido aplicada a la base de datos?
Las migraciones de una BBDD suelen tener procesos para revertir el mismo. Dependiendo la tecnología que estés usando, puede ser de una manera u otra. Continua con el curso o explora la documentación de la tecnología.
Sería bueno hablar de Scaffold-DbContext, no?
Hola, No me esta permitiendo crear las migraciones y me sale este error:
'Categoria' cannot be used as a property on entity type 'Tarea' because it is configured as a navigation.
Esto a que se debe no logro encontrar algo al respecto?
Por favor Edgar, nos compartes el código por fa, este es un error de la configuracion y esctructura del código pero necesito verlo bien para decirte donde esta el problema
Hay que sobre escribir el metodo OnModelCreating para correr miraciones? porque me da error al crear la migracion
No es necesario. Este metodo se usa para modelar la base de datos cuando usas FluentAPI pero con atributos también se puede y se pueden activar las migraciones
¿Es posible realizar una automatización de BackUp previo a realizar la operación de migración en la base de datos? Esto para prevenir que se pierdan datos si lo que se quería no era correcto
Profe, no se si en algun curso lo explica pero me gustaria conocer tambien como llevar de manera correcta la trazabilidad de los logs y cuales son las buenas practicas para esto, agradezco su respuesta.
Genial! Logré añadir un campo "Expectations" al modelo de Tareas ^^