public TrackedProperty<Stammdaten> Anrede
{...
|
News:
|
|
Nachfrage: Wie sieht es bei multi-client Einsatz aus? Soll vor Speichern gegen die DB geprüft werden, ob dort noch die ursprünglich geladenen Daten stehen, sprich ob schon ein anderer Client 'drübergespeichert' hat? In dem Fall müsstest Du eh eine Db Abfrage (mehr) einbauen.
– DaSpors 14.07.2010
|
public class FooExt
{
public Foo Foo {get; set;}
public bool IsDirty {get; set;}
// public int CheckSumAtBegin {get; set;}
}
|
|
|
OK. Das sind Gedanken die uns auch schon durch den Kopf sind. Würde aber für uns heissen: VIEL umbauen.
– GENiALi 14.07.2010
|
||
|
Ist es möglich eine Zwischenschicht einzubauen?
Dann zB einen Cache erstellen die Originalobjekte enthält und gegen die geprüft werden kann... – gfoidl 14.07.2010
|
||
|
Das währe auch meine Lösung. Alle Welt arbeitet mit dem Dirty-Flag, Warum nicht ihr? ;-)
– klaus_b 14.07.2010
|
||
update Stammdaten set Anrede='Frau' where ...
update Stammdaten set Anrede='Frau', updated=UNIX_TIMESTAMP()
where (...) and !(Anrede<=>'Frau')
|
|
|
OK. Bei der Idee kommt mir in den Sinn das ich noch eine Bedinung vergessen habe.
Wer hat die Änderung vorgenommen. – GENiALi 14.07.2010
|
||
|
Geht doch immer noch über einen Trigger:
update Stammdaten set Anrede='Frau', updated=UNIX_TIMESTAMP(), last_changed_by='GENiALi' where (...) and !(Anrede<=>'Frau') – BeachBlocker 14.07.2010
|
||
|
OK. Da mir die Trigger nicht ganz so geläufig sind, wie bringe ich den UserName vom C# Code in den Trigger?
UserName im Progi ist nicht gleich UserName auf der DB. – GENiALi 14.07.2010
|
||
|
OK. Habe soeben vom PL gesagt bekommen: Trigger? Nein
Sorry Brauche wohl eine Lösung für C#. – GENiALi 14.07.2010
|
CREATE TRIGGER tblMyTable_HistoryTrigger
ON mydb.dbo.tblMyTable
BEFORE INSERT, UPDATE
AS
insert into mydb.dbo.tblMyTable_History
select getdate(),*
from deleted D
join inserted I on I.a_ID = D.a_ID
where BINARY_CHECKSUM(I.a_ID,I.a_col1,I.a_col2,...)<>BINARY_CHECKSUM(D.a_ID,D.a_col1,D.a_col2,...)
GO
public class MyObject
{
//Eigendlich hier Properties verwenden .. aber ich will mir bissel Schreibarbeit sparen
public int someVar1;
public string someVar2;
public double someVar3;
public Point someVar4;
private int _initialHashCode;
public initialHashCode(){ get { return this.initialHashCode } }
//Sollte aufgerufen werden wenn du alle Daten in dein Object geschrieben hast
public void CalcHash()
{
if(this._initialHashCode== 0)
this._initialHashCode = this.GetHashCode();
}
public override int GetHashCode()
{
var result = 0;
result = result ^ this.someVar1.GetHashCode()
result = result ^ this.someVar2.GetHashCode()
result = result ^ this.someVar3.GetHashCode()
result = result ^ this.someVar4.GetHashCode()
return result;
}
}
...
myObject.sameVar1 = 10;
if(myObject.GetHashCode() == myObject.initialHashCode())
//Omg .. es hat sich was geändert!!
|
|
|
ad GetHashCode - kurz gesagt: nur für Dictionary<TK,TV> udgl. verwenden, sonst können hier Fehler passieren.
Statt GetHashCode eine Methode GetCheckSum und gut ist es (habe ich in meiner AW auch geschrieben ;-) – gfoidl 16.07.2010
|
||
|
"Statt GetHashCode eine Methode GetCheckSum" du musst meine Antwort auch bis zu ende lesen :P
– Floyd 16.07.2010
|
||
|
Ja hab ich schon ganz gelesen ;-)
Das Problem/Feature mit GetHashCode ist nicht nur wegen eines anderen Rechners, sondern wenn die GetHashCode-Methode für die Zustandsermittlung verwendet wird muss dies ja in Einklang mit Equals sein. In einem Dic<TK, TV> liegt nun das urpsrüngliche Objekt rum und kann nicht mehr verwendet werden da ein anderer Wert für GetHashCode für das Objekt existiert -> "Inkonsistenz". An deiner Antwort wollte ich nicht rütteln - die ist ja korrekt ;-) – gfoidl 16.07.2010
|
||
|
Hmm ... Equals müßte trotzem gehen ?! Da Equals in der Standardimplemtierung die Ergebnisse von GetHashCode() beider zu vergleichender Objekte vergleicht müßte das selbe Ergebnis raus kommen.
Darüber hinaus könnte man, wie du es bereits in deinem post geschrieben hast, das ganze auch "GetCheckSum" nennen. Wollte nun mal ne Diskussion anstoßen weil mir sonst zu langweilig wird. – Floyd 16.07.2010
|
insert into Stammdaten_History
select 'GENiALi' as Username, Now() as Updated, Anrede, Vorname, Nachname, ...
from Stammdaten
where (...) and (!(Anrede<=>'Frau') or ...)
update Stammdaten set Anrede='Frau', ... where ...
|
|
|
In dem Fall wäre ein Trigger sinnvoller da man das Historyschreiben a) nicht an allen stellen nachpflegen muss, b) man es nicht vergessen kann, c) es eine Menge Schreibarbeit sparrt
– Floyd 14.07.2010
|