¿Alguien sabe cómo puedo especificar el valor predeterminado para una propiedad DateTime usando el atributo System.ComponentModel DefaultValue?
por ejemplo, intento esto:
[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }
Y espera que el valor sea una expresión constante.
Esto está en el contexto del uso con ASP.NET Dynamic Data. No quiero crear un andamio en la columna DateCreated, sino simplemente proporcionar DateTime.Now si no está presente. Estoy usando Entity Framework como mi capa de datos
Salud,
Andrés
fuente
get
parte se puede simplificar a:return dateCreated ?? DateTime.Now;
Agregue a continuación a la propiedad DateTime
fuente
No hay ninguna razón por la que pueda pensar que no debería ser posible hacerlo a través de un atributo. Podría estar en la cartera de pedidos de Microsoft. Quién sabe.
La mejor solución que he encontrado es usar el parámetro defaultValueSql en la primera migración del código.
No me gusta la solución de referencia frecuente de configurarlo en el constructor de la clase de entidad porque si algo más que Entity Framework pega un registro en esa tabla, el campo de fecha no obtendrá un valor predeterminado. Y la idea de usar un disparador para manejar ese caso me parece incorrecta.
fuente
He probado esto en EF core 2.1
Aquí no puede utilizar convenciones ni anotaciones de datos. Debe utilizar la API Fluent .
Documento oficial
fuente
Es posible y bastante simple:
para
DateTime.MinValue
para cualquier otro valor como último argumento de la
DefaultValueAttribute
cadena especificada que representa el valor DateTime deseado.Este valor debe ser una expresión constante y es necesario para crear object (
DateTime
) usandoTypeConverter
.fuente
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)
Una solución simple si está utilizando Entity Framework es agregar una clase particular y definir un constructor para la entidad, ya que el marco no define uno. Por ejemplo, si tiene una entidad llamada Example, colocaría el siguiente código en un archivo separado.
fuente
Creo que la solución más sencilla es configurar
en la declaración de columna y en VS2010 EntityModel, el diseñador establece la propiedad de columna correspondiente StoreGeneratedPattern = Computed .
fuente
Crear una nueva clase de atributo es una buena sugerencia. En mi caso, quería especificar 'predeterminado (DateTime)' o 'DateTime.MinValue' para que el serializador Newtonsoft.Json ignorara los miembros de DateTime sin valores reales.
Sin el atributo DefaultValue, el serializador JSON daría como resultado "1/1/0001 12:00:00 AM" aunque la opción DefaultValueHandling.Ignore estuviera configurada.
fuente
Simplemente considere establecer su valor en el constructor de su clase de entidad
fuente
Datetime
propiedad anulable antes de hacer esto.Necesitaba una marca de tiempo UTC como valor predeterminado y, por lo tanto, modifiqué la solución de Daniel de esta manera:
Para el tutorial de DateRangeAttribute, vea esta increíble publicación de blog
fuente
utilizando System.ComponentModel.DataAnnotations.Schema;
fuente
Hay una manera. Agrega estas clases:
DefaultDateTimeValueAttribute.cs
DefaultDateTimeExtensions.cs
Y utilice DefaultDateTimeValue como atributo de sus propiedades. El valor para ingresar a su atributo de validación son cosas como "Ahora", que se representará en tiempo de ejecución desde una instancia de DateTime creada con un Activador. El código fuente está inspirado en este hilo: https://code.msdn.microsoft.com/A-flexible-Default-Value-11c2db19 . Lo cambié para que mi clase herede con DefaultValueAttribute en lugar de ValidationAttribute.
fuente
Enfrenté el mismo problema, pero el que mejor funciona para mí es el siguiente:
fuente
Acabo de encontrar esto buscando algo diferente, pero en la nueva versión de C #, puede usar una versión aún más corta para eso:
fuente
fuente
¿Cómo maneja esto en este momento depende del modelo que esté usando Linq to SQL o EntityFramework?
En L2S puede agregar
EF es un poco más complicado, consulte http://msdn.microsoft.com/en-us/library/cc716714.aspx para obtener más información sobre la lógica empresarial de EF.
fuente
Sé que esta publicación es un poco antigua, pero tengo una sugerencia que puede ayudar a algunos.
Usé un Enum para determinar qué establecer en el constructor de atributos.
Declaración de propiedad:
Constructor de propiedad:
Enum:
fuente
Yo creo que puede hacer esto utilizando
StoreGeneratedPattern = Identity
(ajustado en la ventana de propiedades de diseño del modelo).No habría adivinado que sería así, pero mientras trataba de averiguarlo, noté que algunas de mis columnas de fecha ya estaban predeterminadas
CURRENT_TIMESTAMP()
y otras no. Al verificar el modelo, veo que la única diferencia entre las dos columnas además del nombre es que la que obtiene el valor predeterminado se haStoreGeneratedPattern
establecido enIdentity
.No hubiera esperado que fuera así, pero al leer la descripción, tiene sentido:
Además, aunque esto hace que la columna de la base de datos tenga un valor predeterminado de "ahora", supongo que en realidad no establece que la propiedad esté
DateTime.Now
en el POCO. Esto no ha sido un problema para mí, ya que tengo un archivo .tt personalizado que ya establece todas mis columnas de fecha enDateTime.Now
automáticamente (en realidad, no es difícil modificar el archivo .tt usted mismo, especialmente si tiene ReSharper y obtiene un resaltado de sintaxis plugin. (Las versiones más nuevas de VS ya pueden resaltar la sintaxis de los archivos .tt, no estoy seguro))El problema para mí fue: ¿cómo puedo hacer que la columna de la base de datos tenga un valor predeterminado para que las consultas existentes que omiten esa columna sigan funcionando? Y la configuración anterior funcionó para eso.
No lo he probado todavía, pero también es posible que configurar esto interfiera con la configuración de su propio valor explícito. (Solo me topé con esto en primer lugar porque EF6 Database First escribió el modelo para mí de esta manera).
fuente
En C # Versión 6, es posible proporcionar un valor predeterminado
fuente
Con EF 7:
script de migración:
resultado:
fuente
También quería esto y se me ocurrió esta solución (solo estoy usando la parte de la fecha; un tiempo predeterminado no tiene sentido como predeterminado de PropertyGrid):
Esto solo crea un nuevo atributo que puede agregar a su propiedad DateTime. Por ejemplo, si el valor predeterminado es DateTime.Now.Date:
fuente