Создание поля First Date Framework
Я использую метод Entity Framework Code First для создания моей таблицы базы данных. Следующий код
создает столбец DATETIME
в базе данных, но я хочу создать столбец DATE
.
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
Как создать столбец типа DATE
во время создания таблицы?
Ответы
Ответ 1
Вариант ответа Дэвида Рота на EF6 выглядит следующим образом:
public class DataTypePropertyAttributeConvention
: PrimitivePropertyAttributeConfigurationConvention<DataTypeAttribute>
{
public override void Apply(ConventionPrimitivePropertyConfiguration configuration,
DataTypeAttribute attribute)
{
if (attribute.DataType == DataType.Date)
{
configuration.HasColumnType("Date");
}
}
}
Зарегистрируйте это как прежде:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
Это имеет тот же результат, что и подход Тайлера Дурдена, за исключением того, что он использует базовый класс EF для задания.
Ответ 2
Попробуйте использовать ColumnAttribute
из System.ComponentModel.DataAnnotations
(определенный в EntityFramework.dll):
[Column(TypeName="Date")]
public DateTime ReportDate { get; set; }
Ответ 3
Я нашел, что это хорошо работает в EF6.
Я создал соглашение для указания моих типов данных. Это соглашение изменяет тип данных по умолчанию DateTime в создании базы данных с datetime на datetime2. Затем он применяет более конкретное правило к любым свойствам, которые я украсил атрибутом 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"));
}
}
Затем зарегистрируйте соглашение в своем контексте:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Conventions.Add(new DateConvention());
// Additional configuration....
}
Добавьте атрибут к любым свойствам DateTime, которые вы хотите иметь только дату:
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; }
}
Ответ 4
Я использую следующие
[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; }
С Entity Framework 6 и SQL Server Express 2012 - 11.0.2100.60 (X64). Он отлично работает и генерирует типы столбцов времени/даты в сервере sql
Ответ 5
Помимо использования ColumnAttribute
, вы также можете создать условное условное соглашение для 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";
}
}
}
Просто зарегистрируйте соглашение в методе OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
Ответ 6
Если вы предпочитаете не украшать свои классы атрибутами, вы можете установить это в DbContext
OnModelCreating
следующим образом:
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
}
}
Ответ 7
Это просто улучшение для самого голосованного ответа по адресу @LadislavMrnka по этому вопросу
если у вас много столбцов Date
, вы можете создать собственный атрибут, а затем использовать его, когда захотите, это приведет к созданию более чистого кода в классах Entity
public class DateColumnAttribute : ColumnAttribute
{
public DateColumnAttribute()
{
TypeName = "date";
}
}
Использование
[DateColumn]
public DateTime DateProperty { get; set; }
Ответ 8
Лучший способ использования
[DataType(DataType.Date)]
public DateTime ReportDate { get; set; }
но вы должны использовать EntityFramework v 6.1.1