EF 7 establece el valor predeterminado inicial para la columna DateTime

c# entity-framework-core

Pregunta

Necesito poder establecer el valor inicial de una columna DateTime.

Cuando especifico "getutcdate () o DateTime.UtcNow

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

y luego ejecuta dnx . ef migration add InitialMigration EF genera una instantánea de migración con:

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

cuando uso DateTime.UtcNow ...

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

y una migración inicial:

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

cuando uso DateTime.UtcNow ...

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

Parece que tiene que funcionar, pero cuando inserto datos en la tabla, el valor predeterminado para la columna es el 'instante' en el que se creó la marca de tiempo.

¿Me estoy perdiendo de algo?

TAMBIÉN, ya que en el mismo sentido, ¿cómo especificar la IDENTITY SEED en EF7?

Gracias

ACTUALIZACIÓN Después de generar el script sql, con ambas opciones obtengo:

Si usa "getutcdate ()":

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

que no funciona debido a las citas

o si usa DateTime.utcNow:

entity.Property(e => e.ShipDate).DefaultValue("getutcdate()")
entity.Property(e => e.ShipDate).DefaultValue(DateTime.UtcNow)

lo que explica el valor estático que estaba obteniendo.

Supongo que puedo arreglármelas con esto. ¿Esto es un error o hay una forma correcta de hacer esto? Gracias

Respuesta aceptada

Desea establecer el valor predeterminado de SQL, no un valor constante:

entity.Property(e => e.ShipDate).HasDefaultValueSql("getutcdate()");

Respuesta popular

Una solución más flexible utilizando atributos para EF Core:

en su DbContext:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Add your customizations after calling base.OnModelCreating(builder);
    CustomDataTypeAttributeConvention.Apply(builder);
    DecimalPrecisionAttributeConvention.Apply(builder);
    SqlDefaultValueAttributeConvention.Apply(builder);
}

y crea estas clases:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Add your customizations after calling base.OnModelCreating(builder);
    CustomDataTypeAttributeConvention.Apply(builder);
    DecimalPrecisionAttributeConvention.Apply(builder);
    SqlDefaultValueAttributeConvention.Apply(builder);
}

y atributos personalizados:

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    // Add your customizations after calling base.OnModelCreating(builder);
    CustomDataTypeAttributeConvention.Apply(builder);
    DecimalPrecisionAttributeConvention.Apply(builder);
    SqlDefaultValueAttributeConvention.Apply(builder);
}

Entonces podrás decorar las propiedades de tu tabla con cualquiera de estos atributos (o crear tus propios atributos personalizados):

[DecimalPrecision(18, 9)] [SqlDefaultValue("getutcdate()")] [DataType("decimal(18,9)")]




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué