Machen, dass AddOrUpdate nur einige Eigenschaften ändert

Dies mag eine einfache Frage sein, aber ich bin neu bei Code First und Migrations. Ich werde den Beispielcode auf ein Minimum beschränken, um das Problem zu zeigen:

Ich habe einBaseAuditableEntity was dies beinhaltet (unter anderem, aber vereinfachen wir es):

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

Now a (zum Beispiel)User POCO erbt davon:

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; }
}

Ich habe dies in meinem KontextSaveChanges -Methode, um das @ auszufüllCreatedOn undLastModified Termine (vereinfacht):

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();
}

Und jetzt habe ich eine Migration durchgeführt, die einige Benutzer anlässt:

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.
    );
}

Jetzt habe ich ein Problem beim Säen mitAddOrUpdate nach der Migration. Wenn das Objekt neu ist (es wird hinzugefügt),CreatedOn wird korrekt gefüllt und alles funktioniert wie erwartet. Wenn die Entität jedoch geändert wird (sie ist bereits in der Datenbank vorhanden undUserName Matches), versucht es, es mit der neuen Entität zu aktualisieren, die ich erstelle ... dies schlägt fehl, weilCreatedOn hat ein ungültigesDateTime (in diesem Fall,DateTime.MinValue).

Gibt es eine Möglichkeit, das @ zu verwendeAddOrUpdate -Methode, damit die übereinstimmende Entität tatsächlich aus der Datenbank abgerufen und nur die nicht standardmäßigen Felder aktualisiert wird? Oder vielleicht eine Möglichkeit, um zu bestimmen, welche Felder NICHT aktualisiert werden sollen? Für diesen speziellen Fall möchte ich dasCreatedOn Feld unverändert sein, aber eine generische Lösung wäre wünschenswert.

Vielleicht sollte ich mein eigenes machenAddOrUpdate -Methode, die ein Prädikat mit den zu ändernden Feldern enthält, anstatt ihm eine völlig neue Entität zu übergeben?

Das ist EF 6.1

Aktualisiere

Ich weiß, ich kann das leicht für die @ lösCreatedOn Date, das ist, was ich gerade für diesen speziellen Fall mache:

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;
}

Ich bin auf der Suche nach einer allgemeineren Lösung.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage