Création du champ Entity Framework Code Date première

J’utilise la méthode Entity Framework Code First pour créer ma table de firebase database. Le code suivant crée une colonne DATETIME dans la firebase database, mais je souhaite créer une colonne DATE .

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

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

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

 public class DataTypePropertyAtsortingbuteConvention : PrimitivePropertyAtsortingbuteConfigurationConvention { public override void Apply(ConventionPrimitivePropertyConfiguration configuration, DataTypeAtsortingbute atsortingbute) { if (atsortingbute.DataType == DataType.Date) { configuration.HasColumnType("Date"); } } } 

Enregistrez ceci comme avant:

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Add(new DataTypePropertyAtsortingbuteConvention()); } 

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.

Essayez d’utiliser ColumnAtsortingbute partir de System.ComponentModel.DataAnnotations (défini dans EntityFramework.dll):

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

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 firebase database 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’atsortingbut DataType (DataType.Date).

 public class DateConvention : Convention { public DateConvention() { this.Properties() .Configure(c => c.HasColumnType("datetime2").HasPrecision(3)); this.Properties() .Where(x => x.GetCustomAtsortingbutes(false).OfType() .Any(a => a.DataType == DataType.Date)) .Configure(c => c.HasColumnType("date")); } } 

Puis enregistrez ensuite la convention dans votre contexte:

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

Ajoutez l’atsortingbut à n’importe quelle propriété DateTime que vous souhaitez définir comme date uniquement:

 public class Participant : EntityBase { public int ID { get; set; } [Required] [Display(Name = "Given Name")] public ssortingng GivenName { get; set; } [Required] [Display(Name = "Surname")] public ssortingng Surname { get; set; } [DataType(DataType.Date)] [Display(Name = "Date of Birth")] public DateTime DateOfBirth { get; set; } } 

Outre ColumnAtsortingbute vous pouvez également créer une convention d’atsortingbut personnalisée pour le DataTypeAtsortingbute :

 public class DataTypePropertyAtsortingbuteConvention : AtsortingbuteConfigurationConvention { public override void Apply(PropertyInfo memberInfo, PrimitivePropertyConfiguration configuration, DataTypeAtsortingbute atsortingbute) { if (atsortingbute.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 DataTypePropertyAtsortingbuteConvention()); } 

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 time / date dans le serveur sql

Si vous préférez ne pas décorer vos classes avec des atsortingbuts, vous pouvez définir ceci dans le DbContext de OnModelCreating comme ceci:

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

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 atsortingbut personnalisé et l’utiliser quand vous le souhaitez, cela produira du code plus propre dans les classes Entity.

 public class DateColumnAtsortingbute : ColumnAtsortingbute { public DateColumnAtsortingbute() { TypeName = "date"; } } 

Usage

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

la meilleure façon d’utiliser le

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

mais vous devez utiliser EntityFramework v 6.1.1