DateTime and UTC in Entity Framework

c# code-first datetime entity-framework utc


Is it feasible to have Entity Framework save all DateTime values in the database as UTC (I'm presently using the Code First Approach with CTP5)?

Or, is there maybe a method to indicate it in the mapping? Consider the mapping for the last login column, for instance:

modelBuilder.Entity<User>().Property(x => x.Id).HasColumnName("id");
modelBuilder.Entity<User>().Property(x => x.IsAdmin).HasColumnName("admin");
modelBuilder.Entity<User>().Property(x => x.IsEnabled).HasColumnName("enabled");
modelBuilder.Entity<User>().Property(x => x.PasswordHash).HasColumnName("password_hash");
modelBuilder.Entity<User>().Property(x => x.LastLogin).HasColumnName("last_login");
10/19/2017 2:37:19 PM

Popular Answer

Here is one strategy to think about:

Let's first define the following quality:

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)

        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)

            var dt = property.PropertyType == typeof(DateTime?)
                ? (DateTime?) property.GetValue(entity)
                : (DateTime) property.GetValue(entity);

            if (dt == null)

            property.SetValue(entity, DateTime.SpecifyKind(dt.Value, attr.Kind));

After that, connect that attribute to your EF context:

public class MyContext : DbContext
    public DbSet<Foo> Foos { get; set; }

    public MyContext()
        ((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
            (sender, e) => DateTimeKindAttribute.Apply(e.Entity);

On any nowDateTime or DateTime? properties, you may use the following attribute:

public class Foo
    public int Id { get; set; }

    public DateTime Bar { get; set; }

With this in place, anytime Object Framework loads a database entity, it will set theDateTimeKind that you designate, like UTC.

Keep in mind that this has no effect while saving. Before attempting to store the data, the value must still be accurately translated to UTC. However, you may set the type when receiving such that it can be serialized as UTC or translated to other time zones usingTimeZoneInfo .

9/23/2014 8:03:31 PM

Related Questions


Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow