A volte quando si utilizza Entity Framework Code First, le convenzioni di default non creano il tipo di database desiderato. Ad esempio, per impostazione predefinita una proprietà di tipo System.DateTime
crea una colonna del database di tipo DateTime
. Che cosa fare se si desidera che abbia un tipo di datetime2
(il tipo DateTime
che non ha problemi con i fusi orari e l'ora legale)?Codice quadro entità Primo: quale attributo DataType per DateTime2?
È possibile specificare il tipo di database richiesto con Annotazioni dati utilizzando DataTypeAtrribute
. Uno dei costruttori di DataTypeAttribute accetta un parametro DataType Enumeration. Così si potrebbe specificare qualcosa di simile:
[DataType(DataType.DateTime)]
public DateTime DateOfBirth {get; set;}
Il tipo di tipo di dati di enumerazione contiene un sacco di tipi, tuttavia manca un valore per DateTime2
.
Un altro approccio sarebbe l'utilizzo dell'API Fluent. Creare un metodo di DateTime2
in DBContext.OnModelCreating:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().Property(p => p.BirthDate)
.HasColumnType("datetime2");
}
Il DataTypeAttribute ha un second constructor that accepts a string. Questa stringa è definita come
Il nome del modello di campo personalizzato da associare al campo dati.
Così si potrebbe supporre che il seguente sarebbe sufficiente a creare un datetime2:
[DataType("datetime2")]
public DateTime DateOfBirth {get; set;}
Ahimè, questo non funziona. La colonna creata ha ancora il formato DateTime
.
Domanda: quale stringa da utilizzare nel costruttore per creare un datetime2?