NHibernate-Update mit zusammengesetzten Schlüssel
-
26-09-2019 - |
Frage
Ich habe eine Tabelle defnition wie unten angegeben:
Lizenz
ClientId
Type
Total
Used
ClientId und Typ identifiziert zusammen eine Zeile eindeutig. Ich habe eine Zuordnungsdatei wie unten angegeben:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true">
<class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" lazy="false" table="License">
<id name="ClientId" access="field" column="ClientID" />
<property name="Total" access="field" column="Total"/>
<property name="Used" access="field" column="Used"/>
<property name="Type" access="field" column="Type"/>
</class>
</hibernate-mapping>
Wenn ein Client eine Lizenz verwendet, um einen Benutzer zu erstellen, muss ich die Gebraucht Spalte in der Tabelle aktualisieren. Wie ich ClientId Spalte wie die id-Spalte für diese Tabelle in der Mapping-xml gesetzt, erhalte ich TooManyRowsAffectedException.
Könnten Sie bitte lassen Sie mich wissen, wie man einen zusammengesetzten Schlüssel auf Mapping-Ebene zu setzen, so dass NHibernate basierend auf ClientId und Typ udpate kann.
So etwas wie: Update Lizenz SET Gebraucht = Gebraucht-1 WHERE ClientId = 'xxx' AND Type = 1
Bitte Hilfe.
Danke, Mahesh
Lösung
Wenn Sie Primärschlüssel ist composite, Ihr Mapping widerspiegeln sollte, und Ihre Klasse Bedürfnisse Equals
und GetHashCode
außer Kraft zu setzen.
Auch wenn ClientId
der Primärschlüssel Ihrer Client
Entität ist, sollten Sie es als many-to-many
Karte, nicht nur eine Id.
Auch, warum geben Sie an lazy="false"
? Sind Sie sich bewusst über die Auswirkungen?
Auch, warum alles mit access="field"
Karte? Haben die Eigenschaften haben einige spezielle Logik?
Dies ist eine überarbeitete Mapping alles bedenkt, dass ich gerade schrieb. Fühlen Sie sich frei, diese Teile zu ignorieren, die nicht anwendbar sind: -)
<class name="Acumen.AAM.Domain.Model.License, Acumen.AAM.Domain" table="License">
<composite-id>
<key-many-to-one name="Client" column="ClientID" />
<key-property name="Type" />
</composite-id>
<property name="Total" />
<property name="Used" />
</class>
Andere Tipps
Sie haben eine Verbund-ID zu verwenden,
http://nhibernate.info/doc/nh /en/index.html#mapping-declaration-compositeid
Wie die anderen Genossen oben erwähnt, haben Sie eine Composite-ID zu verwenden, das nicht eine beste, aber akzeptable Praxis ist.
Auf der anderen Seite, können Sie einfach schreiben Sie ein Update Abfangjäger und stellen sie sicher, dass Ihr Type = 1 innerhalb dieser Gruppe.
Hier sind einige Links über das Thema zu helfen Sie klar in diesen zu sehen.
- Eleganter Code: Implementieren von NHibernate Interceptor
- NHibernate Dokumentation: Interceptor
- Beispiel NHibernate IInterceptor Implementierung
- Unternehmen .NET Community: NHibernate Teil 2 ( Scrollen Sie zu: Interceptor und Persistent Lifecycle )
- NHibernate Interceptor Revision Inserted Objekt-ID (SO Frage)
Der Hauptvorteil der Abfangjäger über einen zusammengesetzten Schlüssel ist, dass es nicht Ihre DBRM nicht bricht und bietet eine deutlich flexiblere Lösung, ohne „verschmutzt“ Ihre Mapping-Datei, die genaue Modell darstellen.