Подтвердить что ты не робот

Создание поля First Date Framework

Я использую метод Entity Framework Code First для создания моей таблицы базы данных. Следующий код создает столбец DATETIME в базе данных, но я хочу создать столбец DATE.

[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }

Как создать столбец типа DATE во время создания таблицы?

4b9b3361

Ответ 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