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!
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();
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.
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% 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.
probiere das vielleicht bin ich falsch, aber es funktioniert
%Vor%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.
Ich habe kürzlich das gleiche Problem angesprochen.
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%Tags und Links asp.net-mvc c# orm nhibernate