Im mit EF4 in VS2010, POCO und der Modell-erste Ansatz.Wie aktualisiert man automatisch die Modified-Eigenschaft einer Entität in Entity Framework 4 beim Speichern?
Meine Entität hat die folgenden Eigenschaften: ID: Guid, Name: Zeichenfolge, Erstellt: DateTime, Geändert: DateTime, Revision: Int32.
Ich erstelle meine Entität, setze den Namen und speichere ihn mit dem EF4-Kontext in der Datenbank. Dies sollte Id zu einem neuen Guid setzen (arbeitet mit Identity-SGP), Created jetzt gesetzt, Modified links wie Null, Revision auf 0 gesetzt. Ich erhole die Entity, ändere den Namen und speichere ihn erneut. Diesmal sollte der Modified-Wert auf jetzt gesetzt werden und die Revision sollte 1.
Wie erreiche ich das am besten mit EF4 mit dem EDMX-Designer?
Update:
Das war, was ich am Ende mit:
public override int SaveChanges(System.Data.Objects.SaveOptions options)
{
foreach (ObjectStateEntry entry in ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified).Where(e => e.Entity is EntityBase))
{
EntityBase entity = entry.Entity as EntityBase;
if (entry.State == EntityState.Added)
{
entity.Version = new Version() { Major = 1, Minor = 0, Revision = 0 };
entity.Created = DateTime.Now;
if (OperationContext.Current != null) entity.CreatedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
else if (entry.State == EntityState.Modified)
{
entity.Version.Revision++;
entity.Modified = DateTime.Now;
if (OperationContext.Current != null) entity.ModifiedBy = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;
}
}
return base.SaveChanges(options);
}
Welche Arbeit ist nicht ... :(
Das Problem ist, dass die entry.State ist noch nicht modifizierte selbst wenn ich die MarkAsModified() - Methode explizit ausführe, bekomme ich das nicht ...
Warum ist das Änderungs-Tracking nicht standardmäßig aktiviert? Selbst-Tracking-Entitäten so warum sollte ich es wollen und explizit jedes Mal einschalten? Und warum bleiben Entitäten auch dann auf db, wenn der Status unverändert ist? Und was ist der Unterschied zwischen EntityState und ObjectState? Im Moment mache ich alle Änderungen und Updates serverseitig, aber ich werde auch einen WCF-Dienst verwenden, um Entitäten einige Zeit später hin und her zu transferieren ... Gibt es einen Unterschied darin, wie Änderungen hier behandelt werden? Wenn serverseitig alle Änderungen, egal ob Changetracking ein/aus ist, bleibt bestehen ?? Was ich will, ist, dass nichts jemals gespeichert werden könnte, ohne auch Modifiziert, Revision usw. zu aktualisieren. Diese Eigenschaften sollten immer auf dem Server gesetzt werden, wenn das Objekt zurück empfangen und geändert wurde. (Im nicht SQL-Server-Seite hier zu sprechen, aber die Service-Server-Seite)
Danke Ich werde es ausprobieren, aber gibt es eine Möglichkeit, dies auf dem SQL-Server auf Update zu tun? –
Natürlich können Sie eine Datenbank "Trigger" schreiben, die die Tabelle beim Einfügen und Aktualisieren aktualisieren. Dies ist eine Lösung, um es auf der Client-Seite mit Entity-Framework zu tun. –
Ich habe Ihre Methode versucht, aber ich habe Probleme beim Setzen einer Int-Eigenschaft innerhalb einer ComplexType-Eigenschaft auf der aktualisierten Entität. Ich habe eine ComplexType Version mit drei Ints und ich möchte nur den letzten Wert aktualisieren. Das Setzen einer neuen Version scheitert komplett mit der Ausnahme, dass ich IExtendedDataRecord implementieren muss. Ist das wirklich notwendig? –