entity-framework - example - hascolumntype entity framework core
Código de entidad de Entidad Primera creación del campo Fecha (8)
Además de usar ColumnAttribute
, también puede crear una convención de atributo personalizada para DataTypeAttribute
:
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());
}
Estoy utilizando el primer método de Entity Framework Code para crear mi tabla de base de datos. El siguiente código crea una columna DATETIME
en la base de datos, pero quiero crear una columna DATE
.
[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?
Encontré que esto funciona en EF6 muy bien.
Creé una convención para especificar mis tipos de datos. Esta convención cambia el tipo de datos predeterminado de DateTime en la creación de la base de datos de datetime a datetime2. A continuación, aplica una regla más específica a las propiedades que he 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 cualquier propiedad DateTime que desee que sea solo la 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; }
}
Intente utilizar ColumnAttribute
desde System.ComponentModel.DataAnnotations
(definido en EntityFramework.dll):
[Column(TypeName="Date")]
public DateTime ReportDate { get; set; }
La versión EF6 de la respuesta de David Roth es la siguiente:
public class DataTypePropertyAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DataTypeAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration,
DataTypeAttribute attribute)
{
if (attribute.DataType == DataType.Date)
{
configuration.HasColumnType("Date");
}
}
}
Registre esto como antes:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
Esto tiene el mismo resultado que el enfoque de Tyler Durden, excepto que está usando una clase base EF para el trabajo.
Si prefiere no decorar sus clases con atributos, puede configurar esto en el DbContext
de OnModelCreating
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
}
}
Yo uso lo 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 columna de hora / fecha en el servidor sql
la mejor forma de usar el
[DataType(DataType.Date)]
public DateTime ReportDate { get; set; }
pero debe usar EntityFramework v 6.1.1
Esto es solo una mejora para la respuesta más votada por @LadislavMrnka sobre esta cuestión
si tiene muchas columnas de Date
, puede crear un atributo personalizado y luego usarlo cuando lo desee, esto producirá más código limpio en las clases de entidad
public class DateColumnAttribute : ColumnAttribute
{
public DateColumnAttribute()
{
TypeName = "date";
}
}
Uso
[DateColumn]
public DateTime DateProperty { get; set; }