NHibernate gibt nach dem Einfügen weiterhin ein Update aus

8

Ich habe sehr einfache unidirektionale Abbildungen. siehe unten:

%Vor%

Nach diesem Post nach dem Nhibernate 3 und höher sollte das Setzen des Schlüssels als nicht Nullable das Insert-Update-Problem beheben (Das Problem, wenn NHibernate eine Einfügung mit einem Fremdschlüssel ausgibt, der auf null gesetzt ist, und dann eine Aktualisierung, um den Fremdschlüssel zu aktualisieren, um den Wert zu korrigieren), aber das ist nicht der Fall für mich. Wenn ich den Schlüssel als nicht nullfähig festlege, gibt NHibernate eine korrekte insert-Anweisung aus

%Vor%

Wie Sie sehen, fügt es das ContactId-Feld ein, aber danach gibt es immer noch die update-Anweisung

aus %Vor%

Also, um das Problem zu klären. NHibernate fügt die Kontaktzeile mit korrekt zugewiesenem Fremdschlüssel ein und gibt anschließend eine Aktualisierungsanweisung aus, um den Fremdschlüssel (ContactId) zu aktualisieren, der redundant ist.

Wie kann ich diese redundante Update-Anweisung loswerden? Danke.

Übrigens verwende ich die neueste Version von NHibernate und Fluent NHibernate. Die Datenbank ist SQLite

    
Davita 13.07.2012, 10:27
quelle

5 Antworten

20

Sie müssen "updatable"=false auf Ihren Schlüssel setzen, um eine Aktualisierung zu verhindern.

%Vor%     
hazzik 20.07.2012, 08:55
quelle
4
  

Sie können nicht ab 3.2.0 BETA.

In Version 3.2.0 BETA führte eine Verbesserung zu Eins-zu-vielen zu einer Unidirektionalität der Eins-zu-Viele-Beziehungen (eigentlich bin ich mir nicht sicher, ob das so ist).

Vor 3.2 müssten Sie den Fremdschlüssel so einstellen, dass Nullen für diese Art von Beziehung funktionieren. Also würde ich die Tatsache ignorieren, dass dies passiert und einfach damit gehen. Andernfalls müssen Sie es in eine vollständig bidirektionale Beziehung ändern.

  
  • [NH-941] - Eins-viele, die nullbare Fremdschlüssel benötigen
  •   

Versionshinweise oder JIRA-Problem

bearbeiten Auch die Antwort auf den Beitrag, auf den Sie verweisen, besteht darin, save null-save-update zu reparieren, anstatt das zusätzliche Update zu reparieren

    
Rippo 13.07.2012 11:54
quelle
3

Versuchen Sie, inverse auf true für das Mapping festzulegen und die Beziehung im Code zuzuweisen.

Inverse bedeutet, dass das Kind dafür verantwortlich ist, die ID des Elternteils zu halten.

z.B.

%Vor%

Wenn Sie die Einfügung für den PhoneNumber-Datensatz ausführen, kann NH die ContactId einfügen, ohne eine separate Aktualisierung vornehmen zu müssen.

Das habe ich früher in NH 2 gemacht, ich würde annehmen, dass das Verhalten in 3 immer noch gleich funktioniert.

    
Trevor Pilley 13.07.2012 13:13
quelle
3

Ich weiß nicht, ob Sie es wirklich loswerden können.

Versuchen Sie, einen anderen ID-Generator als nativ zu verwenden. Es zwingt NH, den Datensatz nur einzufügen, um die ID zu erhalten. Die ID wird für jede Entität in der Sitzung verwendet, sodass sie später nicht eingefügt werden kann. Es kann nachfolgende Aktualisierungen geben. Verwenden Sie Hi-Lo oder etwas Ähnliches.

Bearbeiten

Warum verwenden Sie in diesem Fall keine Komponente? Sie müssen die Telefonnummer nicht separat zuordnen, wenn sie nur aus einer Nummer besteht. So etwas (ich bin kein FNH-Benutzer, also kann es falsch sein):

%Vor%     
Stefan Steinegger 13.07.2012 11:54
quelle
1

Das hat Trevor Pilley gesagt. Verwende inverse="true" . Wenn Sie inverse="true" nicht verwenden möchten, ist dies die Konsequenz dieser Auswahl. Du kannst es nicht auf beide Arten haben.

    
Jeroen 17.07.2012 12:49
quelle