2017-05-24 9 views
2

데이터베이스의 레코드 열 하나만을 업데이트하고 싶습니다. 전체 레코드가 아니라 하나의 컬럼 (Stav). 나는 NHibernate를 사용하고 DAO를 통해 접근한다.NHibernate를 사용하여 하나의 레코드 열만 업데이트하는 방법

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

위의 코드는 전체 레코드를 업데이트하지만 이는 내가 원하는 것이 아닙니다.

고맙습니다.

+0

당신이 하나의 매개 변수를 말할 때 당신은 무엇을 의미합니까? –

+1

당신의 매핑에서'Dynamic-Update'를 true로 설정할 수 있습니다. 그러나 당신은 당신이이 행동을 원할 때마다 모든 수업에 대해 이것을 설정해야합니다. – Rabban

+0

@Rabban ok, 그러면 어떻게 업데이트 할 수 있습니까? rezervaceDao.Update (r.Stav); did not work – pajasv

답변

3

예제 코드에서는 엔터티에 Update을 호출합니다. 분리 된 엔티티를 갱신하는 경우, 현재 NHibernate 세션에 의해 추적되지 않는 엔티티.

분리 된 엔티티를 갱신 할 때 당신은 NHibernate에게 제공된 엔티티를 가져 와서 데이타베이스에서 그것을 갱신하기위한 완전히 새로운 상태라고 생각하게됩니다. 그래서 당신이 설정하지 않은 모든 속성들은 디폴트 값을 가질 것이고 NHibernate는 그것들이 디폴트 값들로 데이터베이스를 업데이트해야한다고 생각할 것입니다.

하나의 속성 만 변경하려면 먼저 NHibernate로 속성을로드하고 속성을 변경 한 다음 Flush 세션을 변경해야합니다.

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

엔티티가 현재 세션에서로드되었을 때 업데이트 할 엔티티를 NHibernate에 알릴 필요가 없습니다.

기본적으로 NHibernate는 모든 속성을 이전 값으로 변경하고 변경된 값을 새 값으로 업데이트합니다. Rabban answer에 의해 말했듯이,이 동작을 변경하기 위해 클래스 매핑에서 dynamic-update을 활성화하고 NHibernate가 변경된 속성 만 업데이트하도록해야합니다.

참고 :

지금 내가 대답하지만해야 고려해

  • 깃발 질문을 폐쇄하기위한, 하나 등 불분명하거나 (현재 불분명 완료) 중복.
  • 기존 질문에서 현재 가능한 답변을 가리 킵니다. (this comment에서 완료.)
    This answer 우리가 분리 된 경우에는 다른 질문 중 하나가 내 방식보다 낫습니다.
+0

OK 그리고 어디에서해야합니까? 내가 controlin을 수정했기 때문에 세션 참조가 맞지 않았습니까? – pajasv

+0

DAO에서이 작업을 수행해야합니다. –

+0

당신의 DAO가 어떻게 구현되는지 모르겠다. 그래서 여기에 NHibernate API에서해야 할 기본 연산을 적는다. 질문 할 때, 귀하의 문제를 본질적으로 줄이면서 응용 프로그램과 관련된 부분을 제거하고 가능한 한 질문과 관련이없는 부분을 제거하십시오. [mcve]를 참조하십시오. 그래서 네, 귀하의 경우 응용 프로그램이 NHibernate API와 상호 작용하는 곳으로 이동해야합니다. –

1

매핑에 Dynamic-Updatetrue으로 설정해야합니다. 그러나 당신은 당신이이 행동을 원할 때마다 모든 수업에 대해 이것을 설정해야합니다.

참고 : 삽입 달성 같은 캔을 Dynamic-Insert

NHibernate Reference 상태로 :

동적 업데이트 (옵션, 디폴트는 false 일) : 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