Entity Framework 코드 첫 번째 날짜 필드 생성


82

Entity Framework Code First 메서드를 사용하여 데이터베이스 테이블을 만들고 있습니다. 다음 코드 DATETIME는 데이터베이스에 DATE열 을 생성하지만 열 을 생성하고 싶습니다 .

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

DATE테이블 생성 중에 유형의 열을 생성하려면 어떻게해야합니까?

답변:


22

David Roth의 답변의 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 기본 클래스를 사용한다는 점을 제외하면 Tyler Durden의 접근 방식과 동일한 결과를 갖습니다.


164

사용하려고 ColumnAttribute에서 System.ComponentModel.DataAnnotations(EntityFramework.dll에 정의) :

[Column(TypeName="Date")]
public DateTime ReportDate { get; set; }

1
Sequence contains no matching element날짜를 지원하지 않는 DB를 가리키면 오류가 발생할 수 있습니다 . SQL Server 2014는 그렇습니다.
Jess

8
EF6에서는 필요using System.ComponentModel.DataAnnotations.Schema;
JohnnyHK

10

나는 다음을 사용한다

    [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 Server에서 시간 / 날짜 열 유형을 생성합니다.


솔루션이 작동했습니다. @YakoobHammouri의 작동하지 않았습니다. 둘 다 주석을 사용했다 [DataType(DataType.Date)]그리고 [Column(TypeName = "Date")]당신은 제안했다. 그러나이 솔루션 yyyy-mm-dd은 반대로 날짜 형식을 만들었습니다MM-dd-yyyy
nam

9

나는 이것이 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; }
}

1
정말 훌륭한 솔루션입니다! 내가 완전히 명확하게 추가하고 싶은 것은 이것을 사용하려면 날짜 속성에 속성을 추가해야한다는 것입니다 (예 : [DataType (DataType.Date)]] public DateTime IssueDate {get; 세트; }
Stephen Lautier 2014-10-28

@StephenLautier 예, 특정 DateTime 속성에만 사용할 수 있도록하려면 속성을 추가해야합니다. 추가 한 코드에서 모든 DateTime 유형에 일반 규칙을 적용한 다음 DataType (DataType.Date) 장식이있는 유형에 더 구체적인 규칙을 적용 할 수도 있음을 보여줍니다. 이것이 혼란을 없애기를 바랍니다.
Tyler Durden 2014 년

1
좋은 솔루션이지만 EF는이 작업을 수행하는 기본 클래스를 제공합니다. 자세한 내용은 내 솔루션을 참조하십시오.
리처드

@Richard 나는 당신이 맞기 때문에 당신의 해결책을 찬성했습니다. 내가 솔루션을 만든 이유는 EF가 .NET DateTime 속성과 호환되는 datetime2 데이터 형식이 아니라 SQL Server에서 datetime 데이터 형식을 사용하도록 DateTime 속성을 기본값으로 설정했기 때문입니다. 고맙게도 EF core가이 문제를 해결했습니다.
Tyler Durden 19

5

당신이 속성으로 클래스를 장식하지 않으려면, 당신은이를 설정할 수 DbContextOnModelCreating이 같은 :

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
    }
}

4

를 사용하는 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());
}

이것은 EF에 내장되어야합니다. 공유해 주셔서 감사합니다!
tugberk 2013-06-20

불행히도 이것은 EF6에서 더 이상 사용되지 않으며 더 이상 유효하지 않습니다.
Tyler Durden 2014

1
EF6는 새로운 방법을 제공했습니다. 자세한 내용은 내 솔루션을 참조하십시오.
Richard

3

이것은 이 질문에 대해 @LadislavMrnka 가 가장 많이 투표 한 답변 에 대한 개선 사항 일뿐입니다.

Date열 이 많은 경우 사용자 지정 특성을 만든 다음 원할 때 사용할 수 있습니다. 그러면 Entity 클래스에서 더 깨끗한 코드가 생성됩니다.

public class DateColumnAttribute : ColumnAttribute
{
    public DateColumnAttribute()
    {
        TypeName = "date";
    }
}

용법

[DateColumn]
public DateTime DateProperty { get; set; }

-3

사용하는 가장 좋은 방법

[DataType(DataType.Date)]
public DateTime ReportDate { get; set; }

하지만 EntityFramework v 6.1.1 을 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.