Detail
#28331
Falsche Update-Typ-Erstellung in tUpdate führt zu ignorieren von Hidden-Attribut-Änderungen
Bei Attributen mit eigenentwickelter Speicherimplementierung, die Werte in versteckte Zielattribute umleiten, wird fälschlicherweise ein CreateUpdate statt eines EditUpdates erstellt. Dies führt dazu, dass Null-Werte nicht gespeichert werden können.
Konkretes Szenario:
- Attribut A besitzt eine Custom-Speicherimplementierung
- Eingaben in A werden nicht direkt in A gespeichert, sondern transformiert in das versteckte Attribut B
- A zeigt stets den Wert von B multipliziert mit 10 an
- Eingaben in A werden durch 10 geteilt und in B persistiert
- Beispiel: Eingabe "100" in A → Speicherung "10" in B → Anzeige "100" in A
Fehlerverhalten:
Beim Versuch, Attribut A auf null zu setzen, wird ein CreateUpdate generiert. Da die Speicherimplementierung bei CreateUpdates mit null-Werten keine Persistierung durchführt, bleibt die gewünschte Null-Setzung wirkungslos.
Ursache:
Die tUpdate-Methode erstellt automatisch ein CreateUpdate, wenn kein bestehendes AttributeUpdate vorhanden ist, ohne zu prüfen, ob das zugehörige Objekt bereits existiert.
if (update == null) { update = newCreateUpdate(part); // Immer CreateUpdate - FALSCH }
Lösung
Vor der Update-Erstellung muss geprüft werden, ob das bearbeitete Objekt bereits existiert:
- Bei existierenden Objekten: EditUpdate verwenden
- Bei neuen Objekten: CreateUpdate verwenden
if (update == null) { TLObject object = getEditedObject(); if (object == null) { update = newCreateUpdate(part); // Neues Objekt } else { update = newEditUpdateDefault(part, false); // Bestehendes Objekt } }