remove migrations from framework enable disable c# .net entity-framework ef-code-first dbcontext

c# - from - entity framework enable migrations disable



¿Cómo arreglar el error de conversión datetime2 fuera de rango usando DbContext y SetInitializer? (11)

Aunque esta pregunta es bastante antigua y ya hay respuestas excelentes, pensé que debería poner una más que explica 3 enfoques diferentes para resolver este problema.

Primer enfoque

Asignar explícitamente la propiedad DateTime public virtual DateTime Start { get; set; } public virtual DateTime Start { get; set; } public virtual DateTime Start { get; set; } a datetime2 en la columna correspondiente en la tabla. Porque, por defecto, EF lo datetime a datetime y datetime .

Esto se puede hacer mediante una API o anotación de datos fluida.

  1. Fluent API

    En la clase DbContext overide OnModelCreating y configure la propiedad Start (por razones de explicación, es una propiedad de la clase EntityClass).

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { //Configure only one property modelBuilder.Entity<EntityClass>() .Property(e => e.Start) .HasColumnType("datetime2"); //or configure all DateTime Preperties globally(EF 6 and Above) modelBuilder.Properties<DateTime>() .Configure(c => c.HasColumnType("datetime2")); }

  2. Anotación de datos

    [Column(TypeName="datetime2")] public virtual DateTime Start { get; set; }

Segundo enfoque

Inicialice Start a un valor predeterminado en el constructor de EntityClass. Esto es bueno como si, por alguna razón, el valor de Start no se establece antes de guardar la entidad en el inicio de la base de datos siempre tendrá un valor predeterminado. Asegúrese de que el valor predeterminado sea mayor o igual a SqlDateTime.MinValue (desde el 1 de enero de 1753 hasta el 31 de diciembre de 1999)

public class EntityClass { public EntityClass() { Start= DateTime.Now; } public DateTime Start{ get; set; } }

3er enfoque

¿ Start a ser de tipo nulo ? DateTime -note ? después de DateTime -

public virtual DateTime? Start { get; set; }

Para más explicaciones lee esta post

Estoy utilizando las API DbContext y Code First introducidas con Entity Framework 4.1.

El modelo de datos utiliza tipos de datos básicos, como string y DateTime . La única anotación de datos que estoy usando en algunos casos es [Required] , pero eso no está en ninguna de las propiedades de DateTime . Ejemplo:

public virtual DateTime Start { get; set; }

La subclase DbContext también es simple y se ve así:

public class EventsContext : DbContext { public DbSet<Event> Events { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Event>().ToTable("Events"); } }

El inicializador establece fechas en el modelo a valores razonables en este año o el próximo año.

Sin embargo, cuando ejecuto el inicializador, aparece este error en context.SaveChanges() :

La conversión de un tipo de datos datetime2 a un tipo de datos datetime resultó en un valor fuera de rango. La instrucción se ha terminado.

No entiendo por qué sucede esto, porque todo es tan simple. Tampoco estoy seguro de cómo solucionarlo ya que no hay ningún archivo edmx para editar.

¿Algunas ideas?


Debe asegurarse de que Start sea mayor o igual a SqlDateTime.MinValue (1 de enero de 1753) - de manera predeterminada Start es igual a DateTime.MinValue (1 de enero de 0001).


En algunos casos, DateTime.MinValue (o equivalentemente, por default(DateTime) ) se utiliza para indicar un valor desconocido. Este método de extensión simple debería ayudar a manejar el problema:

public static class DbDateHelper { /// <summary> /// Replaces any date before 01.01.1753 with a Nullable of /// DateTime with a value of null. /// </summary> /// <param name="date">Date to check</param> /// <returns>Input date if valid in the DB, or Null if date is /// too early to be DB compatible.</returns> public static DateTime? ToNullIfTooEarlyForDb(this DateTime date) { return (date >= (DateTime) SqlDateTime.MinValue) ? date : (DateTime?)null; } }

Uso:

DateTime? dateToPassOnToDb = tooEarlyDate.ToNullIfTooEarlyForDb();


En mi caso esto sucedió cuando utilicé la entidad y la tabla sql tiene el valor predeterminado de datetime == getdate (). Entonces, ¿qué hice para establecer un valor para este campo?


Estoy usando Database First y cuando me pasó este error, mi solución fue forzar ProviderManifestToken = "2005" en el archivo edmx (haciendo que los modelos sean compatibles con SQL Server 2005). No sé si es posible algo similar para Code First.


Mi solución fue cambiar todas las columnas de fecha y hora a datetime2, y usar datetime2 para cualquier columna nueva. En otras palabras, haga que EF use datetime2 por defecto. Agregue esto al método OnModelCreating en su contexto:

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

Eso obtendrá todo el DateTime y DateTime? propiedades en todas sus entidades.


Puede hacer que el campo sea nulo, si eso se ajusta a sus inquietudes específicas de modelado. No se forzará una fecha nula a una fecha que no esté dentro del rango del tipo SQL DateTime de la forma en que lo haría un valor predeterminado. Otra opción es mapear explícitamente a un tipo diferente, tal vez con,

.HasColumnType("datetime2")


Sencillo. En su código primero, establezca el tipo de DateTime en DateTime ?. Por lo tanto, puede trabajar con el tipo de fecha y hora anulable en la base de datos. Ejemplo de entidad:

public class Alarme { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public DateTime? DataDisparado { get; set; }//.This allow you to work with nullable datetime in database. public DateTime? DataResolvido { get; set; }//.This allow you to work with nullable datetime in database. public long Latencia { get; set; } public bool Resolvido { get; set; } public int SensorId { get; set; } [ForeignKey("SensorId")] public virtual Sensor Sensor { get; set; } }


Si sus propiedades DateTime son nullable en la base de datos, entonces asegúrese de utilizar DateTime? para las propiedades de objeto asociadas o EF pasará en DateTime.MinValue para valores no asignados que están fuera del rango de lo que puede manejar el tipo de fecha y hora de SQL.


Tuve el mismo problema y en mi caso estaba estableciendo la fecha en DateTime () nuevo en lugar de DateTime.Now


inicializar la propiedad Start en el constructor

Start = DateTime.Now;

Esto funcionó para mí cuando intentaba agregar algunos campos nuevos a la tabla de usuarios de ASP .NET Identity Framework (AspNetUsers) usando Code First. Actualicé el Class - ApplicationUser en IdentityModels.cs y agregué un campo lastLogin de tipo DateTime.

public class ApplicationUser : IdentityUser { public ApplicationUser() { CreatedOn = DateTime.Now; LastPassUpdate = DateTime.Now; LastLogin = DateTime.Now; } public String FirstName { get; set; } public String MiddleName { get; set; } public String LastName { get; set; } public String EmailId { get; set; } public String ContactNo { get; set; } public String HintQuestion { get; set; } public String HintAnswer { get; set; } public Boolean IsUserActive { get; set; } //Auditing Fields public DateTime CreatedOn { get; set; } public DateTime LastPassUpdate { get; set; } public DateTime LastLogin { get; set; } }