Entity Framework Code First DateTime field update on modification

c#, datetime, ef-code-first, entity-framework, entity-framework-migrations

Solution

First, consider that `DateTimeOffset` is a better choice if you are going to be storing local times. Alternatively, you could use a UTC-based `DateTime`, but I will show `DateTimeOffset` in this example. Never store a local-based `DateTime` for this purpose, as you will have issues with time zones and daylight saving time. See also: The Case Against DateTime.Now.

Next, consider a common interface that you can use for entities that you wish to track created/updated values.

public interface IDatedEntity
{
    DateTimeOffset Created { get; set; }
    DateTimeOffset Updated { get; set; }
}

Apply that interface and its properties to the entities you are working with.

public class User : IDatedEntity
{
    // ...

    public DateTimeOffset Created { get; set; }
    public DateTimeOffset Updated { get; set; }
}

Now in your database context, you can attach to the `SavingChanges` event and apply the desired behavior:

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public MyContext()
    {
        var objectContext = ((IObjectContextAdapter)this).ObjectContext;
        objectContext.SavingChanges += (sender, args) =>
        {
            var now = DateTimeOffset.Now;
            foreach (var entry in this.ChangeTracker.Entries<IDatedEntity>())
            {
                var entity = entry.Entity;
                switch (entry.State)
                {
                    case EntityState.Added:
                        entity.Created = now;
                        entity.Updated = now;
                        break;
                    case EntityState.Modified:
                        entity.Updated = now;
                        break;
                }
            }
            this.ChangeTracker.DetectChanges();
        };
    }
}

Note the final call to `DetectChanges`, which will ensure that the new updated date values are applied to all modified entities.

Problem

I have the following entity: ``` public class User { public int UserId { get; set; } public string UserName { get; set; } public string UserAddress { get; set; } public DateTime CreateDate { get; set; } public DateTime? UpdateDate { get; set; } } ``` How can I make the `UpdateDate` field of the `User` entity become the server `DateTime` on an update? That is to say, whenever an entity in the database becomes modified, the `UpdateDate` field changes to that exact date and time as well as if to say `UpdateDate = new DateTime(Datetime.Now.Ticks)`

Original source

Related problems