2017-05-24 6 views
2

Ich möchte nur eine Spalte eines Datensatzes in meiner Datenbank aktualisieren. Nicht die ganze Platte, sondern nur eine Spalte (Stav). Ich verwende NHibernate und ich greife über ein DAO zu.So aktualisieren Sie nur eine Spalte eines Datensatzes mit NHibernate

Rezervace_dao rezervaceDao = new Rezervace_dao(); 
r.Stav = 1; 
rezervaceDao.Update(r); 

Der obige Code aktualisieren den gesamten Datensatz, aber das ist nicht was ich will.

Vielen Dank.

+0

was meinst du, wenn du einen Parameter sagst? –

+1

Sie können 'Dynamic-Update' in Ihren Mappings auf true setzen. Aber Sie müssen es für jede Klasse festlegen, wo Sie dieses Verhalten möchten. – Rabban

+0

@Rabban ok, also wie mache ich dann das Update ... sowas wie: rezervaceDao.Update (r.Stav); hat nicht funktioniert – pajasv

Antwort

3

In Ihrem Beispielcode rufen Sie Update für eine Entität auf. Dies gilt für das Aktualisieren von getrennten Entitäten, Entitäten, die von Ihrer aktuellen NHibernate-Sitzung nicht erfasst werden.

Wenn Sie eine gelöschte Entität aktualisieren, weisen Sie NHibernate an, die bereitgestellte Entität zu übernehmen und sie als ihren vollständigen neuen Status zu betrachten, um sie in der Datenbank zu aktualisieren. Daher haben alle Eigenschaften, die Sie nicht festgelegt haben, ihre Standardwerte, und NHibernate wird in Betracht ziehen, die Datenbank mit diesen Standardwerten zu aktualisieren.

Wenn Sie nur eine Eigenschaft ändern möchten, müssen Sie sie zuerst mit NHibernate laden, ändern Sie die Eigenschaft und dann Flush die Sitzung.

var r = session.Load<Rezervace>(id); 
r.Stav = 1; 
session.Flush(); 

Es gibt keine Notwendigkeit, NHibernate zu sagen, welche Entität aktualisieren Sie, wenn das Unternehmen aus der aktuellen Sitzung geladen wurde.

Standardmäßig aktualisiert NHibernate weiterhin alle Eigenschaften mit ihren vorherigen Werten und die geänderte mit ihrem neuen Wert. Wie von Rabban answer angegeben, müssen Sie dynamic-update in Ihrer Klassenzuordnung aktivieren, um dieses Verhalten zu ändern, und NHibernate muss nur die geänderte Eigenschaft aktualisieren.

Hinweise:

Ich halte jetzt sollte ich nicht aber geantwortet:

  • Flagge die Frage zum Schließen entweder als unklar oder doppelte (heute unklar gemacht).
  • Zeigen Sie auf aktuelle mögliche Antworten in bereits bestehenden Fragen. (Fertig in this comment.)
    This answer zu einer dieser anderen Fragen ist übrigens besser als meins, wenn wir im Einzelfall sind.
+0

OK und wo soll ich es tun .. weil ich update in controllet und es gibt keine Sitzungsreferenz oder? – pajasv

+0

Sie sollten dies in DAO tun. –

+0

Ich weiß nicht, wie Ihr DAO implementiert ist, deshalb schreibe ich hier nur die grundlegenden Operationen, die Sie für die NHibernate-API ausführen müssen. Bitte denken Sie bei der Frage, dass Sie Ihre Probleme auf das Wesentliche reduzieren sollten, indem Sie Teile entfernen, die für Ihre Anwendung spezifisch und für die Frage so wichtig wie möglich sind. Siehe [MCVE]. Also ja, in Ihrem Fall müssen Sie das verschieben, wo Ihre Anwendung mit NHibernate API interagiert. –

1

Sie müssen in Ihrem Mapping Dynamic-Update auf true setzen. Aber Sie müssen es für jede Klasse festlegen, wo Sie dieses Verhalten möchten.

Bitte beachten Sie: Das gleiche gilt für Einsätze erreicht mit Dynamic-Insert

Die NHibernate Reference Zustände:

Dynamic Update (optional, Standardeinstellung false): Gibt an, dass UPDATE SQL sein sollte zur Laufzeit generiert und enthalten nur die Spalten, deren Werte sich geändert haben.

Ein Beispiel aus der NHibernate Referenz (verkürzt):

<?xml version="1.0"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg" 
namespace="Eg"> 
    <class name="Cat" table="CATS" dynamic-update="true"> 
      <id name="Id" column="uid" type="Int64"> 
        <generator class="hilo"/> 
      </id> 
      <property name="BirthDate" type="Date"/> 
      // other properties 
    </class> 
</hibernate-mapping> 

Die Nachteile sind here diskutiert.

+0

Beachten Sie, dass die Entität eine losgelöste Entität ist. –

+0

@AmitJoshi Ich fürchte, du hast Recht. Aber er hat es nicht angegeben, und es ist möglich, dass sich die Entität in derselben Session/UnitOfWork befindet, aber aus einem anderen Repository stammt. Zusammen mit der Antwort von [@ Frédéric] (https://stackoverflow.com/a/44155153/6666799) sollte er in der Lage sein, es zu lösen und das ganze Problem zu verstehen. – Rabban

Verwandte Themen