2017-05-24 4 views
2

データベースのレコードの1つの列だけを更新したいとします。レコード全体ではなく、1つの列(Stav)。私はNHibernateを使用しており、私はDAOを通してアクセスします。NHibernateでレコードの1つの列を更新する方法

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

上記のコードはレコード全体を更新しますが、それは私が望むものではありません。

ありがとうございました。

+0

あなたが1つの仲間と言うときはどういう意味ですか? –

+1

あなたのマッピングで 'Dynamic-Update'をtrueに設定することができます。しかし、あなたはこの振る舞いをしたいすべてのクラスのためにそれを設定しなければなりません。 – Rabban

+0

@Rabban ok、どうやって更新しますか?rezervaceDao.Update(r.Stav); did not work – pajasv

答えて

3

例のコードでは、エンティティでUpdateを呼び出します。これは、分離されたエンティティを更新する場合、現在のNHibernateセッションによって追跡されないエンティティです。

デタッチされたエンティティを更新するときに、NHibernateに、指定されたエンティティを取得し、それを完全な新しい状態とみなして、データベースで更新するように指示します。したがって、設定していないすべてのプロパティはデフォルト値を持ち、NHibernateはそれらのデフォルト値でデータベースを更新する必要があると考えます。

1つのプロパティだけを変更する場合は、最初にNHibernateでロードし、プロパティを変更してから、セッションをFlushにする必要があります。

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

エンティティが現在のセッションからロードされたときに更新するエンティティをNHibernateに伝える必要はありません。

デフォルトでは、NHibernateは以前の値ですべてのプロパティを更新し、新しい値で変更したプロパティも更新します。 Rabban answerで述べたように、この振舞いを変更するためにクラスマッピングでdynamic-updateを有効にし、NHibernateに変更されたプロパティのみを更新させる必要があります。

注:

私は今、私は答えていないはずですが、検討してください:

  • フラグとして不明確または(今は不明として行う)重複閉じるための質問、のいずれかを。
  • 既存の質問の中で現在の可能な回答を指す。 (this commentで完了。)
    This answerこれらの他の質問のうちの1つは、私たちが離脱した場合には、私の方法よりも優れています。
+0

OKと私はそれを行う必要があります..私はupdateinのコントロールレットを行ったので、セッションrefの権利はありません? – pajasv

+0

これはDAOで行う必要があります。 –

+0

あなたのDAOがどのように実装されているのかわからないので、ここではNHibernate APIで行う必要がある基本的な操作をここに書きます。尋ねるときには、あなたの悩みを徹底的にストライプして、アプリケーションに固有の部分と問題に無関係な部分をできるだけ除去することを検討してください。 [mcve]を参照してください。あなたのケースでは、あなたのアプリケーションがNHibernate APIとやりとりする場所を移動する必要があります。 –

1

Dynamic-Updatetrueに設定する必要があります。しかし、あなたはこの振る舞いをしたいすべてのクラスのためにそれを設定しなければなりません。

注意してください:

動的更新(オプション、デフォルトはfalse):Dynamic-Insert

NHibernate Reference状態での挿入のために達成同じ缶をUPDATE SQLがあるべきことを指定します実行時に生成され、値が変更された列のみを含みます。

NHibernateの基準の例(短縮):

<?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> 

欠点hereを議論しています。

+0

エンティティは分離エンティティであることに注意してください。 –

+0

@AmitJoshiあなたが正しいのではないかと恐れています。しかし、彼はそれを述べておらず、エンティティは同じSession/UnitOfWorkに存在する可能性がありますが、別のリポジトリから来る可能性があります。 [@Frédéric](https://stackoverflow.com/a/44155153/6666799)からの回答とともに、彼はそれを解決し、問題全体を理解できるはずです。 – Rabban

関連する問題