Я использую метод Entity Framework Code First для создания таблицы базы данных. Следующий код создает DATETIME
столбец в базе данных, но я хочу создать DATE
столбец.
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
Как я могу создать столбец типа DATE
во время создания таблицы?
Sequence contains no matching element
если указываете на БД, которая не поддерживает дату. SQL Server 2014 делает.using System.ComponentModel.DataAnnotations.Schema;
Я использую следующие
[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
источник
@YakoobHammouri
не сработало. Пришлось использовать обе аннотации[DataType(DataType.Date)]
и[Column(TypeName = "Date")]
как вы предложили. Однако это решение создало формат даты, аyyyy-mm-dd
неMM-dd-yyyy
Я нашел, что это прекрасно работает в 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; } }
источник
Если вы не хотите украсить свои классы с атрибутами, вы можете установить это в
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 } }
источник
Помимо использования,
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()); }
источник
Это просто улучшение для наиболее популярного ответа @LadislavMrnka на этот вопрос
если у вас много
Date
столбцов, вы можете создать настраиваемый атрибут, а затем использовать его, когда захотите, это даст более чистый код в классах Entitypublic class DateColumnAttribute : ColumnAttribute { public DateColumnAttribute() { TypeName = "date"; } }
Применение
[DateColumn] public DateTime DateProperty { get; set; }
источник
Лучший способ использовать
[DataType(DataType.Date)] public DateTime ReportDate { get; set; }
но вы должны использовать EntityFramework v 6.1.1
источник