Entity Framework-Validierung mit teilweise Aktualisierungen

Bin ich mit Entity Framework 5.0 mit DbContext-und POCO-Entitäten. Es gibt eine einfache Einheit mit 3 Eigenschaften:

public class Record
{
    public int Id { get; set; }
    public string Title { get; set; }
    public bool IsActive { get; set; }
}

Dem Titel-Feld ist immer unverändert, und die UI zeigt einfach, ohne jedes Eingabefeld, um es zu ändern. Das ist, warum die Title Feld null wenn das Formular an den server gesendet wird.

Hier ist, wie ich sage EF zu führen partielles update des Unternehmens (IsActive Feld nur):

public class EFRepository<TEntity>
{
   ...
   public void PartialUpdate(TEntity entity, params Expression<Func<TEntity, object>>[] propsToUpdate)
   {
       dbSet.Attach(entity);
       var entry = _dbContext.Entry(entity);
       foreach(var prop in propsToUpdate)
           contextEntry.Property(prop).IsModified = true;
   }
}

und der Ruf:

repository.PartialUpdate(updatedRecord, r => r.IsActive);

Aufrufen SaveChanges Methode, bekomme ich die DbEntityValidationException, das mir sagt, Title erforderlich ist. Wenn ich dbContext.Configuration.ValidateOnSaveEnabled = false ist alles OK.
Gibt es eine Möglichkeit, vermeiden Sie das deaktivieren der überprüfung auf den gesamten Kontext und zu sagen, das EF nicht die Eigenschaften überprüft werden, die nicht aktualisiert wird?
Vielen Dank im Voraus.

  • Dies scheint wie eine Menge Arbeit, um etwas zu tun, das ist ganz einfach, befassen sich mit sonst. Sie gehören einfach einem versteckten Feld im Formular mit Ihrer read-only-Modell Elemente, dann sind Sie in dem update enthalten und EF macht seinen ändern, tracking-und kennt den Wert nicht geändert hat.
  • Was ist stub Personen als? Zum Beispiel, ich hab eine Action-Methode, die Sie markiert eine Person, die als gelöscht. Die folgenden code: var person = new Person { Id = 5 }; dbSet.Attach(person); dbSet.Entry(person).Property(p => p.IsDeleted).IsModified = true; dbContext.SaveChanges(); wird die Ursache die gleiche Ausnahme. Tut DbContext Validierung der Arbeit gut mit stub-Entitäten überhaupt? Ich möchte aviod abrufen der gesamten Entität aus der Datenbank nur für die Markierung als gelöscht.
  • Funktioniert es wirklich? Befestigen Sie wird verwendet, wenn Sie eine Entität in der hand und Sie sind sicher, dass diese Entität in der Datenbank existiert und ist identisch. Ordnen Sie eine Person, die sich von dem unterscheidet, was in der Filiale (der Titel ist anders). Dann Kennzeichnen Sie die entity als geändert (durch Markierung einer Eigenschaft geändert werden kann). Da EF arbeitet auf Personen und nicht auf Eigenschaften, die es aktualisieren wird, alle Eigenschaften und nicht nur die, die als geändert markiert. Mein mentales Modell von der EF sagt mir, dass der Title-Spalte in der Datenbank auf null gesetzt werden nach diesem. Können Sie überprüfen, wenn dies nicht der Fall ist?
  • Validierung standardmäßig überprüft, die alle Eigenschaften von Entitäten in der Zusätzlichen und Geänderten Zustand. Es ist möglich, dieses Verhalten zu ändern durch die Verwendung von Erweiterungsmechanismen ausgesetzt durch die Validierung. Beachten Sie, dass sobald Sie markieren Sie Ihr angeschlossenen Unternehmen als geändert es ist nicht mehr ein stub-Einrichtung, wie ich glaube, es wird an die Datenbank geschickt werden...
  • EF ermöglicht partielle updates der Einheit. Zum Beispiel dbSet.Attach(entity); dbContext.Entry(entity).State = EntityState.Modified; dbContext.SaveChanges(); update wird die gesamte Einheit. Wenn Sie sagen, dass EF explizit, welche Eigenschaften zu aktualisieren, nur sind diese Eigenschaften aktualisiert. dbSet.Attach(entity); dbContext.Entry(entity).Property(e => e.Title).IsModified = true; dbContext.SaveChanges(); update nur Titel. Mit deaktiviert die Validierung, das funktioniert gut.
  • Mit diesem Ansatz(explizit sagen, EF, welche Eigenschaften zu aktualisieren) auch kann ich update eine andere Eigenschaft (entity.IsActive = false), aber bisher habe ich nicht markieren Sie ihn als aktualisiert (e => e.IsActive).IsModified = true; es wird nicht aktualisiert. entity.State = EntityState.Modified markiert die gesamte Einheit als sofort aktualisiert.
  • Sie müssen nicht zum abrufen der Entität zu markieren als gelöscht, nur ein einfaches SQL-Anweisung mit dbSet.SqlCommand("UPDATE entity SET deleted = true where x = y"), das ist VIEL einfacher als der Weg, den Sie nehmen.
  • Ich denke du bist über-engineering eine Lösung. Es darf heute arbeiten, aber AFAIK ist dies keine unterstützte Möglichkeit, dies zu tun, was bedeutet, es kann brechen in einer zukünftigen version. Die Tatsache, dass Sie die Probleme sollten Ihnen sagen, dass es nicht, in der Tat, tatsächlich funktioniert. Stub-Entitäten werden unterstützt, aber Sie können nur der Schlüssel-Wert wird unterstützt. Wenn Sie mehr als nur die Schlüssel, es ist kein stub mehr.
  • BTW, stub-Einheiten sind nicht mehr die bevorzugte Methode, eher die FK Vereine sind. Und Sie sind leistungsfähiger.
  • Glaube nicht, über die raw-sql 🙂 vielen Dank für Eure Antworten, Jungs

InformationsquelleAutor Skog | 2012-10-13
Schreibe einen Kommentar