web-dev-qa-db-fra.com

Création du champ First Date du code Entity Framework

J'utilise la méthode Entity Framework Code First pour créer ma table de base de données. Le code suivant crée une colonne DATETIME dans la base de données, mais je veux créer une colonne DATE.

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

Comment créer une colonne de type DATE, lors de la création d'une table?

77
sfgroups

La version EF6 de la réponse de David Roth est la suivante:

public class DataTypePropertyAttributeConvention 
    : PrimitivePropertyAttributeConfigurationConvention<DataTypeAttribute>
{
    public override void Apply(ConventionPrimitivePropertyConfiguration configuration, 
        DataTypeAttribute attribute)
    {
        if (attribute.DataType == DataType.Date)
        {
            configuration.HasColumnType("Date");
        }
    }
}

Enregistrez-le comme avant:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}

Cela a le même résultat que l'approche de Tyler Durden, sauf qu'il utilise une classe de base EF pour le travail.

20
Richard

Essayez d'utiliser ColumnAttribute de System.ComponentModel.DataAnnotations (défini dans EntityFramework.dll):

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

J'ai trouvé que cela fonctionne bien dans EF6.

J'ai créé une convention pour spécifier mes types de données. Cette convention modifie le type de données DateTime par défaut dans la création de la base de données de datetime à datetime2. Il applique ensuite une règle plus spécifique à toutes les propriétés que j'ai décorées avec l'attribut 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"));
    }
}

Enregistrez ensuite la convention dans votre contexte:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
    modelBuilder.Conventions.Add(new DateConvention());
    // Additional configuration....
}

Ajoutez l'attribut à toutes les propriétés DateTime que vous souhaitez être uniquement date:

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

J'utilise suivant

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

Avec Entity Framework 6 et SQL Server Express 2012 - 11.0.2100.60 (X64). Il fonctionne parfaitement et génère des types de colonnes heure/date dans le serveur SQL

6
Irfan Ashraf

Si vous préférez ne pas décorer vos classes avec des attributs, vous pouvez le configurer dans les DbContextOnModelCreating comme ceci:

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

Outre l'utilisation de ColumnAttribute, vous pouvez également créer une convention d'attribut personnalisée pour 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";
        }
    }
}

Enregistrez simplement la convention dans votre méthode OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention());
}
4
David Roth

Ceci est juste une amélioration pour la réponse la plus votée par @LadislavMrnka sur cette question

si vous avez beaucoup de colonnes Date, vous pouvez créer un attribut personnalisé puis l'utiliser quand vous le souhaitez, cela produira un code plus propre dans les classes Entity

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

Utilisation

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