Laden...

[erledigt] Daten selektieren, Klasse ändern und ChangeObjectState

Erstellt von m.grauber vor 13 Jahren Letzter Beitrag vor 13 Jahren 995 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren
[erledigt] Daten selektieren, Klasse ändern und ChangeObjectState

verwendetes Datenbanksystem: <SQL-Server 2000-2008>, Entity Framework

Hallo,

scheinbar arbeitet hier im Forum niemand mit ChangeObjectState, dazu habe ich nämlich nichts gefunden.

Wie macht ihr bei Euch aber folgendes:

Daten aus der Datenbank werden in ein Objekt selektiert > Einige Felder werden in diesem Objekt geändert (nur interne Sachen) > Das Objekt wird in der Form angezeigt. > Der User kann Daten ändern > Die Daten werden zur Datenbank zurückgeschrieben.

Problem dabei: Die internen Sachen sind Hintergrundinformationen, die den EntityState nicht auf "Modified" ändern sollen. Das sollen nur die Benutzereingaben bewerkstelligen. Wenn ich später aber sichere, sollen die Hintergrundinformationen auch in die DB zurückgeschrieben werden; wenn der User die Daten verwirft natürlich nicht.

Lösungsansätze wären

a) mit ChangeObjectState den EntityState auf "Unchanged" ändern, nachdem die internen Sachen geändert wurden

oder

b) Nachdem die internen Sachen geändert wurden das Objekt nochmals kopieren und mit dieser Kopie weiterarbeiten?

oder

c) diese "internen Sachen" in einem anderen Objekt speichern, weil eine nachfolgende Änderung des EntityStates auf "Unchanged" diese Änderungen beim späteren Speichern und zurückschreiben in die Datenbank nicht ändern würde, auch wenn der Benutzer noch später andere Felder geändert hat.

(Bei a) habe ich zudem beim Versuch den Status zu ändern mit:


.ChangeObjectState(_myClass, System.Data.EntityState.Unchanged)

eine Fehlermeldung:

"Der ObjectStateManager enthält keinen ObjectStateEntry mit einem Verweis auf ein Objekt des Typs MyClass".

_myClass.EntityState kann aber problemlos abgefragt werden, wobei manchmal seltsamerweise auch der Status statt auf "Modified" auf "Detached" steht?

Was empfehlt ihr?

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

F
10.010 Beiträge seit 2004
vor 13 Jahren

Wenn Du ein 2 stufiges ChangeManagement haben willst, musst du es selber implementieren.

Einige Felder werden in diesem Objekt geändert (nur interne Sachen)

Warum/Wieso/Was?

Für mich hört es sich aber eher so an, als wenn da Architektonisch etwas suboptimal gearbeitet wurde.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo FZelle,

Danke für die Info! "suboptimal" kann tatsächlich möglich sein. 🤔

Einige Felder werden in diesem Objekt geändert (nur interne Sachen) heißt:

z.B. in Form ein Dropdown für Benutzer, daneben eine Tabelle mit den Rechten.

Das Benutzerdropdown ist an eine Liste aller Benutzer {binded}.
Die Rechtetabelle ist an eine Liste mit den Rechten {binded}.

In der Rechtetabelle gibt es 1 Feld mit der Benutzer-ID und das Benutzerdropdown ist mit dem Wert! (nicht der Liste) daran gebunden.

Wenn ich nun bei einem Benutzer keine Rechte finde, zeige ich erst einmal alle Standardrechte an. Da diese Standardrechte noch keinem Benutzer zugewiesen sind (Feld Benutzer-ID ist leer), schreibe ich direkt nach dem Laden die Benutzer-ID in das Feld und durch die Bindung an die Combobox wird in dieser bereits der richtige Benutzer angezeigt.

Wahrscheinlich schreibst Du mir jetzt, ich solle das Binding des Wertes der Combobox weglassen und beim Speichern den Wert der Combobox manuell in die Rechteliste schreiben? 😉

Wenn das der bessere Weg ist, würde ich das auch tun. Nur wie komme ich beim Umschalten der Combobox auf einen anderen User an den alten Wert von vorher (der ja dann gespeichert werden soll)? Gibt es etwas wie e.OldValue oder muss ich mir den Vorgängerwert z. B. im GotFocus speichern? (Preview_SelectionChanged) gibt es ja nicht)

Und: Würdest Du grundsätzlich von solchen Manipulationen den EntityState zu ändern eher abraten?

Danke!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

F
10.010 Beiträge seit 2004
vor 13 Jahren

Würdest Du grundsätzlich von solchen Manipulationen den EntityState zu ändern eher abraten?

Ja, denn der State soll eben den Status ausdrücken, nicht irgendwas anderes.

Du hast also Rechte und Benutzer.
Und jedes Recht kann nur an einen Benutzer vergeben werden?
Ungewöhnlich.

Wie sehen denn deine Entities aus?
Ich würde hier Entities vorziehen die IEditableObject implementieren, da reicht dann nämlich ein einfaches .CancelEdit aus.

Auf Codeproject ist ein nicht zu alter Artikel über eine Art Proxy ( auf Basis des Dynamic keywords von FW 4) das sowas nachträglich ermöglicht.
http://www.codeproject.com/KB/cs/dynamicobjectproxy.aspx

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo FZelle,

Du hast Recht 👍 und ich habe es geändert! Ich wollte wirklich fast alles mit Binding machen. Ist aber an dieser Stelle sicher nicht so sinnvoll.

Und jedes Recht kann nur an einen Benutzer vergeben werden?
Ungewöhnlich.

-> Nein, in der Rechteklasse gibt es ja viele Member.

IEditableObject ist sehr interessant, was dort machbar ist. Da ich es nun manuell zuweise, habe ich das Problem in diesem Fall nicht mehr. Kann ich aber sicher an einer anderen Stelle nutzen 🙂

Fazit: manchmal lieber etwas mehr Code schreiben und ggf. auf zu viel Binding verzichten, als zu pfuschen! 😉

Danke nochmals für die wiederholte Hilfe! 👍

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]