Cristian Pisco Intriago
EstudianteJose Saúl Guerrero Serrano
EstudianteFrancisco Ulloa
EstudianteJuan José
EstudianteJosé Javier Vásquez Ramos
EstudianteFelipe de Jesús Isidro
EstudiantePlatzi Team
EstudiantePlatzi Team
EstudianteMiguel Teheran
ProfesorJosé Javier Vásquez Ramos
EstudianteMiguel Teheran
ProfesorRandall Chacón Sarmiento
EstudianteMarcos Lanuza
EstudianteEdinson Jesús Paternina Rivera
EstudianteMiguel Teheran
ProfesorMarcos Lanuza
EstudianteMiguel Teheran
ProfesorJulio Alberto Prisco Pastrana
EstudianteLuis Gonzalo Quijada Romero
EstudianteMauricio Zárate
Estudianteerick soto huamanhorcco
EstudianteEdward Rodríguez
EstudianteLuis Alvarez
EstudianteMathías Cabrera
EstudianteJesus Maria Gonzalez Guardo
EstudianteMiguel Teheran
ProfesorMarcos Sanz
EstudianteDaniel Valencia Alvarez
EstudianteMauricio Brito
EstudianteJuan Sebastian Gamba
EstudianteSergio Sanchez
EstudianteMiguel Teheran
ProfesorDaniel Valencia Alvarez
EstudianteVictor Alexander De Jesus De Nobrega
EstudianteXavier Medina Veintimilla
EstudianteVictor Alexander De Jesus De Nobrega
EstudianteSi usan Postgresql y les da un error con el Datetime.
System.InvalidCastException: 'timestamp with time zone' literal cannot be generated for Local DateTime: a UTC DateTime is required
Colocan lo siguiente en el archivo Program.cs, preferible al inicio.
using entity_framework.src.Classes; using entity_framework.src.Models; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true); ...
Por otro lado, es una sugerencia que la columna FechaCreacion tenga un valor por defecto, cuando hace el insert que tome la fecha del momento, ejemplo:
modelBuilder.Entity<Tarea>(tarea=> { tarea.ToTable("Tarea"); tarea.HasKey(p=> p.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).IsRequired(false); tarea.Property(p=> p.PrioridadTarea); tarea.Property(p=> p.FechaCreacion).HasDefaultValue(DateTime.Now); tarea.Ignore(p=> p.Resumen); tarea.HasData(tareasInit); });
Después tienen que crear la migracion.
dotnet ef migrations add AddDefaultValueToCreatedAtOnTaskTable
dotnet ef database update
Como una alternativa al error de la fecha en postgresql: en vez de llamar DateTime.Now, accedan DateTime.UtcNow. Este error se debe a que postgres solo puede hacer el parsing necesario si la fecha está en formato UTC.
gracias bro
En lugar de agregar la línea
tarea.Property(p => p.Descripcion).IsRequired(false)
También podemos ir al campo del modelo y modificar el tipo de dato string por string? para que admita valores nulos, además de que la advertencia del compilador desaparece
public string? Descripcion { get; set; }
Buen dia estimado, fijese que a mi no me funciona la función IsRequired(false), me lanza error por no ser tipos de datos Nullables, sin embargo, me parece que es correcto que esta definición esté en el Context y no en el model, ya que de usar FluentAPI la responsabilidad de estas definiciones ya no debe ser del Model.
Si le ha sucedido el error que me presenta a mi, y a encontrado una solución de este posible error y la forma correcta de como definir una propiedad Nullable en el Context, la puede compartir por favor.
Me di cuanta que si colocas el sufijo ? en el tipo de dato te lo toma también la propiedad como nula
public string? Descripcion { get; set; }
Y de echo esto es sintaxis moderna de net core para que revisen
y ya con eso yo no tuve problemas con los campos nullos
Para revertir una migración hice lo siguiente: aplique el update database de la migracion anterior y despues si aplique el comando remove migration de la actual migracion
y como hago rollback a una migración?
Lanzas un comando indicando la migración donde quieres que empiece la BD: dotnet ef database update NombreDeMigracionDesdedondeSevaEmpezar
Puedes eliminar la ultima migracion que creaste si tiene algun problema o esta incompleta usado: dotnet ef migrations remove
El signo ? en el modelo permite establecer que la propiedad admita valores nulos, ejemplo:
public string? Descripcion { get; set; }
Sin embargo, entenderia que el objetivo de Fluent API es quitarle al modelo la responsabilidad de estas definiciones, la funcion IsRequire(false) a mi no me funciona, me lanza error diciendome que el tipo de dato String no es Nullable, lo mismo me paso al intentar con un tipo de dato DateTime, creo que es por la version de EFCore que tengo "6.0.5" y la del curso es "6.0.3", investigué en varios foros donde mencionaba que las funciones IsOptional y HasOptional sirven para esto, pero solo para .Net EF no para el Core.
No logro encontrar el porque no me funciona IsRequired(false) en Fluent API, si alguien encuentra como hacerlo en el Context, por favor comparta la solución, no quiero definirlo en el modelo con el sigo "?".
anteriormente String permitia nulos por defecto y no era necesario utilizar el signo ?, ahora si es requerido para indicar que admitre nulos y para que un campo sea no requerido debe admitir nulos en C#. Revisa si tienes estas propiedades en el archivo del proyecto:
<PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup>List<Category> categoryList = new List<Category>(); categoryList.Add(new Category() { CategoryId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c657"), Name = "Pending activities", Effort = 20}); categoryList.Add(new Category() { CategoryId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c602"), Name = "Personal activities", Effort = 50});
List<Homework> homeworkList = new List<Homework>(); homeworkList.Add(new Homework() {HomeworkId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c100"), CategoryId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c657"), PriorityHomework = Priority.Mid, Title = "Payment of public services", CreationDate = DateTime.Now}); homeworkList.Add(new Homework() {HomeworkId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c101"), CategoryId = Guid.Parse("c4e0d0e7-5f06-48c7-9246-11fe12f2c602"), PriorityHomework = Priority.Low, Title = "Finish watching movie", CreationDate = DateTime.Now});
Como curiosidad. En la clase pasada introduje esta nueva propiedad en mi clase de Tareas:
public Urgencia NivelUrgencia { get; set; } public enum Urgencia { Urgente, No_urgente }
En FluentAPI la configuré de esta forma:
Tar.Property(tarea => tarea.NivelUrgencia).IsRequired();
Pero, cuando introduje los datos semilla para las tareas, no configuré ningún objeto con esta propiedad. Al realizar la migración y actualizar la base de datos observé que no devolvió ningún error sobre que esta propiedad estaba vacía.
Al ver la base de datos me percato que estos datos se pusieron por defecto como "0" (el primer elemento de la enumeración) sin haberlo definido en la siembra de datos.
Alguien sabe porque mi visual studio code esta como muerto?, jajaja no me anticipa lo que escribo, osea no tiene intelligicense, no me marca error, ni nada.
Debes instalar la extension de C# para que te funcione el intellicense aveces en windows falla y toca cerrar y volver abrir.
¿Cómo puedo adaptar el código de los ID de las entidades para utilizar valores únicos y auto-incrementados? ¿La configuración se realiza desde Fluent API?
Este tipo de campos se conoce como identity, si lo puedes configurar por atributos o por Fluent API: https://docs.microsoft.com/en-us/ef/core/modeling/generated-properties?tabs=data-annotations
A mi me salió este error:
Que solucioné (como dice el error) agregando esto a TareasContext.cs:
También me sucedio el error, y se debe principalmente a que al usar new DateTime.Now, cada vez que generas una migración se tomará como cambio ya que se actualizará la fecha de creación.
Opté por colocar una fecha fija para que no se tome como cambio en cada migración que hago.
CreatedDate = new DateTime(2024, 12, 10, 17, 1, 57, 586, DateTimeKind.Local)
El error que se presenta a Julio Alberto no es el mismo que el que presenta como respuesta Luis Gonzalo.
A mí me aparecieron los dos errores ;)
El primer error que presenta Julio Alberto indica que la base de datos contiene cambios que aún no han sido agregados a una migración. Es decir, habría que resolver primero las diferencias antes de correr las migraciones. El agregar la línea que planteas, Julio, serviría para casos de desarrollo en donde desactivar esta advertencia es útil para salir al paso. Pero en producción es mejor tener esta advertencia de que los estados de las migraciones no están correctos.
Para el caso del mensaje de Luis, la solución me ayudó a salir del problema, gracias. Sugeriría que este mensaje lo pongas como un nuevo aporte fuera del hilo para que sea más visible.
Tanto a Julio como a Luis, muchas gracias por sus valiosos aportes.
para no estar poniendo .IsRequired(false) tambien puedes agregarlo ? despues del string al momento de crear la tabla Categoria
ejemplo: public string? Categoria{get;set;}
Si alguno está utilizando SQL Server y le genera el error al tratar de actualizar la base de datos, el problema es la fecha y para corregirlo fácil no es sino colocar el campo de fecha creación de la siguiente forma:
category.Property(prop => prop.FechaCreacion).HasDefaultValueSql("GETDATE()");
<u>Consejo para el 2024:</u>
GUID GENERATOR SE DEBE GENERAR, NO MODIFICAR A MANO:
TareasContext.cs
using Microsoft.EntityFrameworkCore; using proyectoef.Models; namespace proyectoef; public class TareasContext: DbContext { public DbSet<Categoria> Categorias {get;set;} public DbSet<Tarea> Tareas {get;set;} public TareasContext(DbContextOptions<TareasContext> options) :base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { List<Categoria> categoriasInit = new List<Categoria>(); //Agregando la nueva coleccion de datos categoriasInit.Add(new Categoria() { CategoriaId = Guid.Parse("ea6202de-5314-4ce0-903b-94fa7c8ef5ed"), Nombre = "Actividades pendientes", Peso = 20}); categoriasInit.Add(new Categoria() { CategoriaId = Guid.Parse("3032c5ab-b477-49a9-83cf-59913875d91d"), Nombre = "Actividades personales", Peso = 50}); modelBuilder.Entity<Categoria>(categoria=> { categoria.ToTable("Categoria"); categoria.HasKey(p=> p.CategoriaId); categoria.Property(p=> p.Nombre).IsRequired().HasMaxLength(150); categoria.Property(p=> p.Descripcion).IsRequired(false); categoria.Property(p=> p.Peso); categoria.HasData(categoriasInit); }); List<Tarea> tareasInit = new List<Tarea>(); tareasInit.Add(new Tarea(){ TareaId = Guid.Parse("ea6202de-5314-4ce0-903b-94fa7c8ef5ed"), CategoriaId = Guid.Parse("d89a0c0f-6b0b-40cf-999a-1922f8a66c86"), PrioridadTarea = Prioridad.Media, Titulo = "Pago de servicios publicos", FechaCreacion = DateTime.Now }); tareasInit.Add(new Tarea(){ TareaId = Guid.Parse("3032c5ab-b477-49a9-83cf-59913875d91d"), CategoriaId = Guid.Parse("af3cad7b-ad33-41c2-8633-c9203a961d7f"), PrioridadTarea = Prioridad.Baja, Titulo = "Terminar de ver pelicula en Netflix", FechaCreacion = DateTime.Now }); modelBuilder.Entity<Tarea>(tarea=> { tarea.ToTable("Tarea"); tarea.HasKey(p=> p.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).IsRequired(false); tarea.Property(p=> p.PrioridadTarea); tarea.Property(p=> p.FechaCreacion); tarea.Property(p => p.Resumen).IsRequired(false); tarea.HasData(tareasInit); }); } } ```**Categoria.cs** ```js using System.ComponentModel.DataAnnotations; namespace proyectoef.Models; public class Categoria { //[Key] public Guid CategoriaId {get;set;} //[Required] //[MaxLength(150)] public string Nombre {get;set;} public string Descripcion {get;set;} public int Peso {get;set;} public virtual ICollection<Tarea> Tareas {get;set;} } ```**Tarea.cs** ```js using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace proyectoef.Models; public class Tarea { //[Key] public Guid TareaId {get;set;} //[ForeignKey("CategoriaId")] public Guid CategoriaId {get;set;} //[Required] //[MaxLength(200)] public string Titulo {get;set;} public string Descripcion {get;set;} public Prioridad PrioridadTarea {get;set;} public DateTime FechaCreacion {get;set;} public virtual Categoria Categoria {get;set;} //[NotMapped] public string Resumen {get;set;} } public enum Prioridad { Baja, Media, Alta }
Muchas gracias por tu aporte. Me salía el siguiente error en la terminal al intentar crear la migración: Unable to create a 'DbContext' of type ''. The exception 'Guid string should only contain hexadecimal characters.' was thrown while attempting to create an instance. For the different patterns supported at design time, see https://go.microsoft.com/fwlink/?linkid=851728. Era cambiar los GUIDs desde el generador y no hacerlo manualmente.
Porqué., en mi caso, siempre debo correr el dotnet bulid antes de cualquier otro de los comandos ?
Lo ideal es siempre correrlo ya que dotnet run va correr la ultima version
En la version EF 9.0.1 me pide que se determine una fecha determinística y no el DateTime.Now().
Es decir especificar una fecha concreta como new DateTime(2025, 01, 01).
Un saludo
Correcto, es retornado un error:
An error was generated for warning 'Microsoft.EntityFrameworkCore.Migrations.PendingModelChangesWarning': The model for context 'DutyContext' changes each time it is built. This is usually caused by dynamic values used in a 'HasData' call (e.g. `new DateTime()`, `Guid.NewGuid()`).
Si igual me salio el mismo error, pude corregirlo con DateTime.Now.Date. que solo contempla la fecha sin las horas. y listo, me dejo avanzar con el update de la BD.
Si estan usando postgresql y les sale este error: 'timestamp with time zone' literal cannot be generated for Local DateTime: a UTC DateTime is required.
No olviden usar para las fechas: DateTime.UtcNow
Siento the DataNotations es mas escalable. Cual es el estandar mas usando en la industria? (DataNotations o FluentAPI)
La idea es usar FluentAPI por que tiene mas control y detalle de lo que estas haciendo, los dataanotations se usan para validaciones
¿Estos datos semilla podrían ser creados aparte, en una carpeta 📁 Seeders y un 📄 archivo dedicado a cada modelo con el fin de no saturar el contexto?
Al hacer el dotnet ef database update me salta el siguiente error: 'timestamp with time zone' literal cannot be generated for Local DateTime: a UTC DateTime is required estoy usando postgreSQL, ¿como podria arreglar este problema?
¡Hola! :D
¿Cuál es el problema que tienes?, ¿en qué te puedo ayudar? Compártenos tu código por favor. Puedes adjuntar imágenes arrastrándolas a esta ventana de comentario.
Nunca pares de aprender 💚
ya encontré la solucion es tan simple como colocar la siguiente linea de codigo:
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
en el program.cs, antes de la linea Builder.services