Do tworzenia tabeli bazy danych używam metody Entity Framework Code First. Poniższy kod tworzy DATETIME
kolumnę w bazie danych, ale chcę utworzyć DATE
kolumnę.
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
Jak mogę utworzyć kolumnę typu DATE
podczas tworzenia tabeli?
Sequence contains no matching element
jeśli wskazujesz bazę danych, która nie obsługuje daty. SQL Server 2014 tak.using System.ComponentModel.DataAnnotations.Schema;
Używam następujących
[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; }
Z Entity Framework 6 i SQL Server Express 2012 - 11.0.2100.60 (X64). Działa doskonale i generuje typy kolumn czasu / daty na serwerze sql
źródło
@YakoobHammouri
nie działa. Musiałem użyć zarówno adnotacji, jak[DataType(DataType.Date)]
i[Column(TypeName = "Date")]
sugerowałeś. Jednak to rozwiązanie stworzyło format datyyyyy-mm-dd
w przeciwieństwie doMM-dd-yyyy
Uważam, że to działa ładnie w EF6.
Stworzyłem konwencję określania moich typów danych. Ta konwencja zmienia domyślny typ danych DateTime podczas tworzenia bazy danych z datetime na datetime2. Następnie stosuje bardziej szczegółową regułę do wszystkich właściwości, które ozdobiłem atrybutem 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")); } }
Następnie zarejestruj się, a następnie konwencja w swoim kontekście:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Add(new DateConvention()); // Additional configuration.... }
Dodaj atrybut do wszystkich właściwości DateTime, które mają być tylko datą:
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; } }
źródło
Jeśli nie chcesz ozdobić swoje zajęcia z atrybutów, można to ustawić w
DbContext
„sOnModelCreating
jak to: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 } }
źródło
Oprócz używania
ColumnAttribute
możesz również utworzyć konwencję atrybutów niestandardowych dlaDataTypeAttribute
: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"; } } }
Po prostu zarejestruj konwencję w swojej metodzie OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention()); }
źródło
To tylko ulepszenie najbardziej pozytywnej odpowiedzi udzielonej przez @LadislavMrnka na to pytanie
jeśli masz wiele
Date
kolumn, możesz utworzyć atrybut niestandardowy, a następnie użyć go, kiedy chcesz, spowoduje to bardziej przejrzysty kod w klasach Entitypublic class DateColumnAttribute : ColumnAttribute { public DateColumnAttribute() { TypeName = "date"; } }
Stosowanie
[DateColumn] public DateTime DateProperty { get; set; }
źródło
najlepszy sposób przy użyciu
[DataType(DataType.Date)] public DateTime ReportDate { get; set; }
ale musisz użyć EntityFramework w wersji 6.1.1
źródło