Ich verwende die Entity Framework Code First-Methode, um meine Datenbanktabelle zu erstellen. Der folgende Code erstellt eine DATETIME
Spalte in der Datenbank, aber ich möchte eine DATE
Spalte erstellen .
[DataType(DataType.Date)]
[DisplayFormatAttribute(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
public DateTime ReportDate { get; set; }
Wie kann ich DATE
während der Tabellenerstellung eine Spalte vom Typ erstellen ?
Sequence contains no matching element
, wenn Sie auf eine Datenbank zeigen, die das Datum nicht unterstützt. SQL Server 2014 funktioniert.using System.ComponentModel.DataAnnotations.Schema;
Ich benutze folgendes
[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; }
Mit Entity Framework 6 und SQL Server Express 2012 - 11.0.2100.60 (X64). Es funktioniert perfekt und generiert Zeit- / Datumsspaltentypen in SQL Server
quelle
@YakoobHammouri
hat nicht funktioniert. Ich musste beide Anmerkungen verwenden[DataType(DataType.Date)]
und[Column(TypeName = "Date")]
wie Sie vorgeschlagen haben. Diese Lösung erstellte jedoch ein Datumsformatyyyy-mm-dd
im Gegensatz zuMM-dd-yyyy
Ich fand das funktioniert in EF6 gut.
Ich habe eine Konvention zum Festlegen meiner Datentypen erstellt. Diese Konvention ändert den Standard-DateTime-Datentyp bei der Datenbankerstellung von datetime in datetime2. Anschließend wird eine spezifischere Regel auf alle Eigenschaften angewendet, die ich mit dem Attribut DataType (DataType.Date) dekoriert habe.
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")); } }
Dann registrieren Sie dann Konvention in Ihrem Kontext:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); modelBuilder.Conventions.Add(new DateConvention()); // Additional configuration.... }
Fügen Sie das Attribut allen DateTime-Eigenschaften hinzu, die nur Datum sein sollen:
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; } }
quelle
Wenn Sie nicht Ihre Klassen mit Attributen schmücken, können Sie diesen Satz in der oben
DbContext
istOnModelCreating
wie folgt aus :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 } }
quelle
Neben der Verwendung können
ColumnAttribute
Sie auch eine benutzerdefinierte Attributkonvention für Folgendes erstellenDataTypeAttribute
: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"; } } }
Registrieren Sie einfach die Konvention in Ihrer OnModelCreating-Methode:
protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Conventions.Add(new DataTypePropertyAttributeConvention()); }
quelle
Dies ist nur eine Verbesserung für die am besten bewertete Antwort von @LadislavMrnka auf diese Frage
Wenn Sie viele
Date
Spalten haben, können Sie ein benutzerdefiniertes Attribut erstellen und es dann verwenden, wann immer Sie möchten. Dadurch wird in den Entitätsklassen saubererer Code erzeugtpublic class DateColumnAttribute : ColumnAttribute { public DateColumnAttribute() { TypeName = "date"; } }
Verwendung
[DateColumn] public DateTime DateProperty { get; set; }
quelle
der beste Weg es mit The
[DataType(DataType.Date)] public DateTime ReportDate { get; set; }
Sie müssen jedoch EntityFramework v 6.1.1 verwenden
quelle