Hacer que AddOrUpdate cambie solo algunas propiedades

Esta podría ser una pregunta simple, sin embargo, soy nuevo en Code First y Migrations, así que tengan paciencia conmigo. Mantendré el código de muestra al mínimo para mostrar el problema:

tengo unBaseAuditableEntity que incluye esto (entre otras cosas, pero simplifiquemos):

public abstract class BaseAuditableEntity : BaseEntity, IAuditableEntity
{
  public DateTime CreatedOn { get; set; }
  public DateTime LastModified { get; set; }
}

Ahora un (por ejemplo)User POCO hereda de ella:

public class User : BaseAuditableEntity
{
  public string UserName { get; set; }
  public string PasswordHash { get; set; }
  public string FullName { get; set; }
  public string Email { get; set; }
  public bool Active { get; set; }
  public DateTime? LastLogin { get; set; }
}

Tengo esto en mi contextoSaveChanges método, para completar elCreatedOn yLastModified fechas (simplificadas):

public override int SaveChanges()
{
  var changeSet = ChangeTracker.Entries<IAuditableEntity>();

  if (changeSet != null)
  {
    foreach (var entry in changeSet.Where(p => p.State != EntityState.Unchanged))
    {
      var now = DateTime.UtcNow;
      if (entry.State == EntityState.Added)
        entry.Entity.CreatedOn = now;
      entry.Entity.LastModified = now;
    }
  }      
  return base.SaveChanges();
}

Y ahora tengo una migración en el lugar que genera algunos usuarios, como este:

protected override void Seed(MyContext context)
{
  context.Users.AddOrUpdate(
      p => p.UserName,
      new User { Active = true, 
                 FullName = "My user name",
                 UserName = "ThisUser",
                 PasswordHash = "",
                 Email = "my@email",
                 LastLogin = null,
            }
      // etc.
    );
}

Ahora tengo un problema al sembrar conAddOrUpdate despues de la migracion. Cuando la entidad es nueva (se está agregando),CreatedOn se llena correctamente y todo funciona como se esperaba. Sin embargo, cuando la entidad se modifica (ya existe en la base de datos yUserName coincide), intenta actualizarlo con la nueva entidad que estoy creando ... esto falla porqueCreatedOn tiene un inválidoDateTime (en este caso,DateTime.MinValue)

¿Hay alguna forma de usar elAddOrUpdate método para que realmente recupere la entidad coincidente de la base de datos y simplemente actualice los campos no predeterminados? ¿O tal vez alguna forma de decirle qué campos NO actualizar? Para este caso específico, me gustaría queCreatedOn campo sin cambios, pero se agradecería una solución genérica.

Tal vez debería hacer lo míoAddOrUpdate método que incluye un predicado con los campos que quiero cambiar, en lugar de pasarle una entidad completamente nueva?

Esto es EF 6.1

Actualizar

Sé que puedo resolver esto fácilmente paraCreatedOn fecha, esto es lo que estoy haciendo actualmente para este caso específico:

foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
{
  var now = DateTime.UtcNow;
  if (entry.State == EntityState.Added)
  {
    entry.Entity.CreatedOn = now;
  }
  else
  {
    if (entry.Property(p => p.CreatedOn).CurrentValue == DateTime.MinValue)
    {
      var original = entry.Property(p => p.CreatedOn).OriginalValue;
      entry.Property(p => p.CreatedOn).CurrentValue = original != SqlDateTime.MinValue ? original : now;
      entry.Property(p => p.CreatedOn).IsModified = true;
     }
   }
   entry.Entity.LastModified = now;
}

Aunque estoy buscando una solución más genérica

Respuestas a la pregunta(2)

Su respuesta a la pregunta