web-dev-qa-db-ja.com

Entity Framework Code First Dateフィールドの作成

Entity Framework Code Firstメソッドを使用してデータベーステーブルを作成しています。次のコードは、データベースにDATETIME列を作成しますが、DATE列を作成したいです。

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

テーブルの作成中にDATE型の列を作成するにはどうすればよいですか?

77
sfgroups

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のアプローチと同じ結果になります。

20
Richard

System.ComponentModel.DataAnnotationsからColumnAttribute(EntityFramework.dllで定義)を使用してみてください。

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

これは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; }
}
9
Tyler Durden

私は以下を使用します

    [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サーバーで時刻/日付列タイプを生成します

6
Irfan Ashraf

クラスを属性で装飾したくない場合は、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
Stoyan Dimov

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());
}
4
David Roth

これは、この質問に関する@ -LadislavMrnkaによる most-voted answer の単なる拡張機能です

Date列がたくさんある場合は、カスタム属性を作成して、必要なときにいつでも使用できます。これにより、Entityクラスでよりクリーンなコードが生成されます

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

使用法

[DateColumn]
public DateTime DateProperty { get; set; }
3
Hakan Fıstık