Создание поля First Date Framework
Я использую метод Entity Framework Code First для создания моей таблицы базы данных. Следующий код создает столбец DATETIME
в базе данных, но я хочу создать столбец DATE
.
[DataType(DataType.Date)] [DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")] public DateTime ReportDate { get; set; }
Как создать столбец типа DATE
во время создания таблицы?
- EF 4.1 загрузка фильтрованных дочерних коллекций, не работающих для многих-ко-многим
- Как включить EF-миграции для разных контекстов для разделения баз данных?
- Отображение представлений базы данных в EF 5.0 Code First w / Migrations
- Код структуры Entity сначала удаляется с помощью каскада
- свойство навигации должно быть виртуальным - не требуется в ef core?
- Организационно, где я должен ставить общие запросы при первом использовании кода Entity Framework?
- Как я могу запросить нулевые значения в структуре сущностей?
- Как обновлять не все поля объекта с использованием Entity Framework и EntityState.Modified
- Шаблон модели данных Entity Data (EDMX) с Visual Studio 2010 с пакетом обновления 1 (SP1) и ADO.NET Entity Framework 4.1
- Улучшать имена свойств навигации при обратном проектировании базы данных
- Тип или имя пространства имен «DbContext» не удалось найти
- Каков синтаксис для самостоятельного ссылки на foreign keys в EF Code First?
- как обновить объект в Entity Framework 4 .NET
Версия ответа EF6 Дэвида Рота выглядит следующим образом:
public class DataTypePropertyAttributeConvention : PrimitivePropertyAttributeConfigurationConvention { 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()); }
Это имеет тот же результат, что и подход Тайлера Дурдена, за исключением того, что он использует базовый class EF для работы.
Попробуйте использовать ColumnAttribute
из System.ComponentModel.DataAnnotations
(определенный в EntityFramework.dll):
[Column(TypeName="Date")] public DateTime ReportDate { get; set; }
Я нашел это хорошо работает в EF6.
Я создал соглашение для указания типов данных. Это соглашение изменяет тип данных по умолчанию DateTime в создании базы данных с datetime на datetime2. Затем он применяет более конкретное правило к любым свойствам, которые я украсил атрибутом DataType (DataType.Date).
public class DateConvention : Convention { public DateConvention() { this.Properties() .Configure(c => c.HasColumnType("datetime2").HasPrecision(3)); this.Properties () .Where(x => x.GetCustomAttributes(false).OfType() .Any(a => a.DataType == DataType.Date)) .Configure(c => c.HasColumnType("date")); } }
Затем зарегистрируйте соглашение в своем контексте:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove(); 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; } }
Помимо использования ColumnAttribute
вы также можете создать условное условное соглашение для DataTypeAttribute
:
public class DataTypePropertyAttributeConvention : AttributeConfigurationConvention { 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()); }
Я использую следующие
[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-сервере
Если вы предпочитаете не украшать свои classы атрибутами, вы можете установить это в DbContext
OnModelCreating
следующим образом:
public class DatabaseContext: DbContext { // DbSet's protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // magic starts modelBuilder.Entity() .Property(e => e.ReportDate) .HasColumnType("date"); // magic ends // ... other bindings } }
Это всего лишь улучшение для самого голосованного ответа от @LadislavMrnka по этому вопросу
если у вас много столбцов Date
, вы можете создать собственный атрибут, а затем использовать его, когда захотите, это приведет к созданию более чистого кода в classах Entity
public 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