Ici est une approche que vous pourriez envisager:
Tout d'abord, définissez cet attribut suivant:
[AttributeUsage(AttributeTargets.Property)]
public class DateTimeKindAttribute : Attribute
{
private readonly DateTimeKind _kind;
public DateTimeKindAttribute(DateTimeKind kind)
{
_kind = kind;
}
public DateTimeKind Kind
{
get { return _kind; }
}
public static void Apply(object entity)
{
if (entity == null)
return;
var properties = entity.GetType().GetProperties()
.Where(x => x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(DateTime?));
foreach (var property in properties)
{
var attr = property.GetCustomAttribute<DateTimeKindAttribute>();
if (attr == null)
continue;
var dt = property.PropertyType == typeof(DateTime?)
? (DateTime?) property.GetValue(entity)
: (DateTime) property.GetValue(entity);
if (dt == null)
continue;
property.SetValue(entity, DateTime.SpecifyKind(dt.Value, attr.Kind));
}
}
}
Maintenant, accrochez cet attribut à votre contexte EF:
public class MyContext : DbContext
{
public DbSet<Foo> Foos { get; set; }
public MyContext()
{
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
(sender, e) => DateTimeKindAttribute.Apply(e.Entity);
}
}
Désormais DateTime
ou DateTime?
propriétés, vous pouvez appliquer cet attribut:
public class Foo
{
public int Id { get; set; }
[DateTimeKind(DateTimeKind.Utc)]
public DateTime Bar { get; set; }
}
Dans ce lieu, chaque fois que Entity Framework charge d'une entité à partir de la base de données, il va mettre la DateTimeKind
que vous spécifiez, telles que l'UTC.
Notez que ce n'est pas faire n'importe quoi lors de l'enregistrement. Vous devrez toujours avoir la valeur correctement converti à l'UTC avant d'essayer de le sauver. Mais il ne vous permet pas de définir le type lors de la récupération, ce qui lui permet d'être sérialisé que l'UTC, ou convertis en d'autres temps, les zones avec TimeZoneInfo
.