Si 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
Juan José
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; }
José Javier Vásquez Ramos
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.
Felipe de Jesús Isidro
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
Platzi Team
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
Platzi Team
y como hago rollback a una migración?
Miguel Teheran
ProfesorLanzas 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
José Javier Vásquez Ramos
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 "?".
Miguel Teheran
Profesoranteriormente 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>Randall Chacón Sarmiento
Marcos Lanuza
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.
Edinson Jesús Paternina Rivera
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.
Miguel Teheran
ProfesorDebes instalar la extension de C# para que te funcione el intellicense aveces en windows falla y toca cerrar y volver abrir.
Marcos Lanuza
¿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?
Miguel Teheran
ProfesorEste 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
Julio Alberto Prisco Pastrana
A mi me salió este error:
Que solucioné (como dice el error) agregando esto a TareasContext.cs:
Luis Gonzalo Quijada Romero
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)
Mauricio Zárate
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.
erick soto huamanhorcco
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;}
Edward Rodríguez
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()");
Luis Alvarez
Mathías Cabrera
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.
Jesus Maria Gonzalez Guardo
Porqué., en mi caso, siempre debo correr el dotnet bulid antes de cualquier otro de los comandos ?
Miguel Teheran
ProfesorLo ideal es siempre correrlo ya que dotnet run va correr la ultima version
Marcos Sanz
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
Daniel Valencia Alvarez
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()`).
Mauricio Brito
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.
Juan Sebastian Gamba
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
Sergio Sanc
Siento the DataNotations es mas escalable. Cual es el estandar mas usando en la industria? (DataNotations o FluentAPI)
Miguel Teheran
ProfesorLa idea es usar FluentAPI por que tiene mas control y detalle de lo que estas haciendo, los dataanotations se usan para validaciones
Daniel Valencia Alvarez
¿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?
Victor Alexander De Jesus De Nobrega
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?
Xavier Medina Veintimilla
¡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 💚
Victor Alexander De Jesus De Nobrega
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
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});
<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 }