NHibernate Update funktioniert nicht

7

Ich kann mein Update nicht zum Laufen bringen. Der Test schlägt fehl und ich sehe keine Update-Anweisungen, die an die Datenbank gesendet werden. Kann mir jemand sagen, was ich falsch mache?

Dies ist meine Repository-Update-Prozedur:

%Vor%

Dies ist der Unit-Test, den ich versuche:

%Vor%

Der Test schlägt immer fehl. Ich sehe, dass die Testdaten eingefügt werden, und ich sehe die Auswahl für den Test. Ich sehe nicht, dass das Update ausgeführt wird. Was vermisse ich?

Danke!

    
Qtax 26.01.2009, 04:14
quelle

6 Antworten

19

Es gibt ein paar Dinge, die passieren können.

1) Die Aktualisierung schlägt fehl und NHibernate löst eine Ausnahme aus, die irgendwo verschluckt wird - das kann je nach Konfiguration der Dinge passieren. Also in VS sicherstellen, dass alle Ausnahmen einen Bruch verursachen.

2) Das Update wird zwischengespeichert und nicht direkt in die DB geschrieben - Sie können erzwingen, dass Daten mit Repository.Flush();

geschrieben werden

3) Sind Sie sicher, dass _projects [0] aus der DB gelesen wurde - ich nehme an, dass das in einem TestSetup passiert? Wenn das nicht der Fall ist, wird NHibernate dies nicht als ein Objekt wahrnehmen, das unter seiner "Kontrolle" steht.

BTW - Es empfiehlt sich, die Daten zu lesen, die Sie innerhalb des Tests selbst ändern möchten, und diese Änderung rückgängig zu machen, indem Sie den DB in den ursprünglichen Zustand zurücksetzen. Auf diese Weise wird Ihre Testdatenbank nicht durch Ihre Tests verändert.

BTW2 - Im obigen Test, wenn project.Name bereits einmal aktualisiert wurde, dh der Test wurde erfolgreich ausgeführt. Dann wird das nächste Mal rund um den Test erfolgreich sein, auch wenn das Update selbst fehlschlägt. Eine Möglichkeit, dies zu vermeiden - hängen Sie eine DateTime an den project.Name an, setzen Sie sie nicht auf einen festen Wert.

    
MrTelly 26.01.2009 11:02
quelle
6

Eine andere Sache ist dies: Wenn Sie eine Entität unter Verwendung einer Sitzung speichern und dieselbe Entität aus derselben Sitzung mit der Entitäts-ID laden, erhalten Sie die gleiche Instanz, die Sie gespeichert haben - unabhängig davon, ob Einfügungen oder Aktualisierungen vorgenommen wurden für die Datenbank ausgestellt.

Das liegt an NHibernates Cache auf der ersten Ebene, einer Identitätskarte, die zur Sitzung gehört.

Wenn Sie möchten, dass Ihr Test überprüft, was tatsächlich in die Datenbank geschrieben wurde, können Sie dies folgendermaßen tun:

%Vor%     
mookid8000 26.01.2009 11:36
quelle
5

ISession.Update in NHibernate schreibt keine Änderungen an der Datenbank vor. Es wird verwendet, um vorübergehende Instanzen in einer anderen Sitzung zu aktualisieren als die, die zum Abrufen der Instanz verwendet wurde (siehe hier für Details). Änderungen werden an die Datenbank gesendet, wenn eine Sitzung gelöscht wird. Standardmäßig werden Sitzungen im FlushOnCommit-Modus ausgeführt, dh die Änderungen an den Objekten werden an die Datenbank gesendet, wenn die NHibernate-Transaktion festgeschrieben wird (siehe hier für Details zu den verschiedenen Flush-Modi.

    
Sean Carpenter 29.01.2009 02:28
quelle
0

probiere das vielleicht bin ich falsch, aber es funktioniert

%Vor%     
Amol Shiledar 17.10.2013 17:58
quelle
0

FlushMode !

Ich führe eine App, die ich nicht geschrieben habe, heraus und finde heraus, dass selbst wenn Sie eine Transaktion verwenden und txn.Commit() aufrufen, die Änderungen möglicherweise nicht angezeigt werden, wenn Ihre NHibernate-Sitzung session.FlushMode = FlushMode.Never .

Sehr einfach zu erkennen. Setzen Sie einen Haltepunkt und schauen Sie sich session.FlushMode an. Oder durchsuchen Sie einfach alle * .cs Dateien nach FlushMode.

    
Jess 12.01.2016 17:38
quelle
0

Ich habe kürzlich das gleiche Problem angesprochen.

  1. Eingetragene
  2. Aktualisierungen nicht

Das Problem war ein Fehler in der Codierung. Die Daten wurden überprüft, ob die Zeile geändert wurde, dann wurde eine neue Entität zugeordnet und eine Aktualisierung wurde gesendet, aber es ist nichts passiert.

Lösung: Die tatsächliche Zeile musste aus der Datenbank abgefragt werden, dann wurden Änderungen in C # auf die Zeile angewendet, die zurückgezogen wurde. Jetzt weiß NHibernate, dass die Zeile geändert wurde, führen Sie Speichern aus und alles funktioniert.

%Vor%     
Patrick 02.08.2016 14:46
quelle

Tags und Links