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

War es hilfreich?

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

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.

  1. Eleganter Code: Implementieren von NHibernate Interceptor
  2. NHibernate Dokumentation: Interceptor
  3. Beispiel NHibernate IInterceptor Implementierung
  4. Unternehmen .NET Community: NHibernate Teil 2 ( Scrollen Sie zu: Interceptor und Persistent Lifecycle )
  5. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top