Estoy usando el método Entity Framework Code First para crear mi tabla de base de datos. El siguiente código crea una DATETIME
columna en la base de datos, pero quiero crear una DATE
columna.
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
¿Cómo puedo crear una columna de tipo DATE
durante la creación de la tabla?
Sequence contains no matching element
si apunta a una base de datos que no admite la fecha. SQL Server 2014 lo hace.using System.ComponentModel.DataAnnotations.Schema;
Yo uso siguiente
[DataType(DataType.Time)] public TimeSpan StartTime { get; set; } [DataType(DataType.Time)] public TimeSpan EndTime { get; set; } [DataType(DataType.Date)] [Column(TypeName = "Date")] public DateTime StartDate { get; set; } [DataType(DataType.Date)] [Column(TypeName = "Date")] public DateTime EndDate { get; set; }
Con Entity Framework 6 y SQL Server Express 2012 - 11.0.2100.60 (X64). Funciona perfectamente y genera tipos de columnas de fecha y hora en el servidor SQL
fuente
@YakoobHammouri
no funcionó. Tuve que usar ambas anotaciones[DataType(DataType.Date)]
y[Column(TypeName = "Date")]
como sugirió. Sin embargo, esta solución creó un formato de fechayyyy-mm-dd
en lugar deMM-dd-yyyy
Encontré que esto funciona muy bien en EF6.
Creé una convención para especificar mis tipos de datos. Esta convención cambia el tipo de datos DateTime predeterminado en la creación de la base de datos de datetime a datetime2. Luego aplica una regla más específica a cualquier propiedad que haya decorado con el atributo DataType (DataType.Date).
public class DateConvention : Convention { public DateConvention() { this.Properties<DateTime>() .Configure(c => c.HasColumnType("datetime2").HasPrecision(3)); this.Properties<DateTime>() .Where(x => x.GetCustomAttributes(false).OfType<DataTypeAttribute>() .Any(a => a.DataType == DataType.Date)) .Configure(c => c.HasColumnType("date")); } }
Luego registre la convención en su contexto:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Add(new DateConvention()); // Additional configuration.... }
Agregue el atributo a las propiedades de fecha y hora que desee que sean solo de fecha:
public class Participant : EntityBase { public int ID { get; set; } [Required] [Display(Name = "Given Name")] public string GivenName { get; set; } [Required] [Display(Name = "Surname")] public string Surname { get; set; } [DataType(DataType.Date)] [Display(Name = "Date of Birth")] public DateTime DateOfBirth { get; set; } }
fuente
Si prefiere no para decorar sus clases con atributos, puede configurar esto en los
DbContext
'sOnModelCreating
de esta manera:public class DatabaseContext: DbContext { // DbSet's protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // magic starts modelBuilder.Entity<YourEntity>() .Property(e => e.ReportDate) .HasColumnType("date"); // magic ends // ... other bindings } }
fuente
Además de usar
ColumnAttribute
, también puede crear una convención de atributos personalizados paraDataTypeAttribute
:public class DataTypePropertyAttributeConvention : AttributeConfigurationConvention<PropertyInfo, PrimitivePropertyConfiguration, DataTypeAttribute> { public override void Apply(PropertyInfo memberInfo, PrimitivePropertyConfiguration configuration, DataTypeAttribute attribute) { if (attribute.DataType == DataType.Date) { configuration.ColumnType = "Date"; } } }
Simplemente registre la convención en su método OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention()); }
fuente
Esto es solo una mejora para el respuesta más votada por @LadislavMrnka sobre esta pregunta
si tienes mucho
Date
columnas, puede crear un atributo personalizado y luego usarlo cuando lo desee, esto producirá un código más limpio en las clases de Entidadpublic class DateColumnAttribute : ColumnAttribute { public DateColumnAttribute() { TypeName = "date"; } }
Uso
[DateColumn] public DateTime DateProperty { get; set; }
fuente
de la mejor manera usando el
[DataType(DataType.Date)] public DateTime ReportDate { get; set; }
pero debes usar EntityFramework v 6.1.1
fuente