NHibernate로 DB의 버전 열을 업데이트하는 방법

Vjatcheslaw

지금:

//banan get in previous session and banan.VersionObject = 1
using (var session = factorySession.OpenSession())
          {
              banan.Name = "diffrent";
              session.Update(banan);
              session.Flush();//exception if version not equal 1
          }
//banan.VersionObject still equals 1

내 hbm 구성 :

<class xmlns="urn:nhibernate-mapping-2.2" dynamic-insert="true" dynamic-update="true" optimistic-lock="version" name="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="FatherBanan">
    <cache region="FatherBanan" usage="read-write" />
    <id name="Id" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="increment" />
    </id>
    <version generated="always" name="VersionObject" type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" unsaved-value="0">
      <column name="VersionObject" not-null="true" default="1" />
    </version>
    <any id-type="System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" meta-type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="WifeBanan">
      <meta-value value="MotherBanan" class="LittleNHibernateProject.Model.MotherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <meta-value value="FatherBanan" class="LittleNHibernateProject.Model.FatherBanan, LittleNHibernateProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <column name="Banan_Type" />
      <column name="Banan_Id" />
    </any>
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Name" />
    </property>
    <property name="Variety" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Variety" />
    </property>
  </class>

두 가지 경로가 있습니다.

  1. 데이터베이스에서 트리거를 사용하십시오. 하지만 모든 엔터티에 대한 트리거 수동 생성을 원하지 않습니다.

  2. 코드에서 다음과 같습니다.

using (var session = factorySession.OpenSession())
          {
              banan.Name = "diffrent";
              session.Update(banan);
              session.Flush();//exception if version change

              banan.VersionObject = banan.VersionObject + 1;
              session.Update(banan);
              session.Flush();
          }

그리고 이것은 (2 경로) 나쁜 습관처럼 보입니다. 어떤 제안이나 연습? 아니면 내 config.hbm이 올바르지 않습니까?

Vjatcheslaw

예, 데이터베이스의 모든 테이블에 트리거를 만듭니다.

            var factory = new DbConfigurationFactory();
            var factorySession = factory.CreateFactory();

            var allClasses = factorySession.GetAllClassMetadata();

            //ReCreate triggers in database
            foreach (var metadata in allClasses)
            {
                var tableName = (metadata.Value as NHibernate.Persister.Entity.AbstractEntityPersister).TableName;

                using (var session = factorySession.OpenSession())
                {
                    var commandText = $@"
DROP TRIGGER IF EXISTS {tableName}trigger ON public.{tableName};

CREATE TRIGGER {tableName}trigger
    BEFORE UPDATE ON public.{tableName}
FOR EACH ROW EXECUTE PROCEDURE update_version_func();
";
                    var command = session.Connection.CreateCommand();
                    command.CommandText = commandText;
                    command.ExecuteNonQuery();
                }
            }

그리고이 작업 :

            FatherBanan banan = null;
            FatherBanan banan2 = null;
            using (var session = factorySession.OpenSession())
            {
                banan = session.Get<FatherBanan>((long)4);
                //banan.VersionObject = 1
            }

            using (var session = factorySession.OpenSession())
            {
                banan2 = session.Get<FatherBanan>((long)4);
                //banan2.VersionObject = 1
            }

            using (var session = factorySession.OpenSession())
            {
                banan.Name = "PPPP";
                session.Update(banan);
                session.Flush();
                //banan.VersionObject = 2
            }

            using (var session = factorySession.OpenSession())
            {
                var newBanan = session.Get<FatherBanan>((long)4);
                //newBanan.VersionObject = 2
            }

            using (var session = factorySession.OpenSession())
            {
                banan2.Name = "PPPP2";
                session.Update(banan2);
                session.Flush();//exception banan2.VersionObject = 1 when in database VersionObject = 2
            }

여기서 update_version_func는 다음과 같습니다.

CREATE OR REPLACE FUNCTION public.update_version_func()
  RETURNS TRIGGER AS
$BODY$
BEGIN
    NEW.VersionObject = NEW.VersionObject +1;
    return NEW;
END
$BODY$
LANGUAGE plpgsql;

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

다른 열을 기반으로 다음 n 행의 평균 값을 계산하는 방법-SQL (Oracle)-이전에 답변 한 질문의 업데이트 버전

분류에서Dev

결과 집합의 이전 행을 기반으로 열 데이터를 업데이트하는 방법

분류에서Dev

원래 값으로 전달 된 함수의 출력으로 DB의 모든 행의 특정 열 값을 업데이트하는 방법.

분류에서Dev

Nhibernate로 행을 업데이트하는 방법

분류에서Dev

Internet Explorer 11을 버전 11.1155.15063.0으로 업데이트하는 방법

분류에서Dev

Fedora에서 npm을 최신 버전으로 업데이트하는 방법

분류에서Dev

Ubuntu 18.04에서 Python을 최신 버전으로 업데이트하는 방법

분류에서Dev

Java 런타임 버전을 7에서 8로 업데이트하는 방법

분류에서Dev

다른 열의 값을 기반으로 열을 업데이트하는 방법

분류에서Dev

데이터 프레임 파이썬의 이전 행을 기반으로 행을 업데이트하는 방법

분류에서Dev

npm 버전을 호출하는 방법 (내 패키지의 버전을 업데이트 한 다음 커밋)

분류에서Dev

SQL에서 4 개의 열로 열을 업데이트하는 방법

분류에서Dev

번들을 사용하여 Rails 저장소에서 로컬로 복제 된 heroku ruby의 gem 버전을 업데이트하는 방법은 무엇입니까?

분류에서Dev

요리 책을 최신 버전으로 안전하게 업데이트하는 방법은 무엇입니까?

분류에서Dev

Reducer 내부의 배열로 여러 값을 업데이트하는 방법

분류에서Dev

Android 프로젝트의 업그레이드 버전을 테스트하는 방법은 무엇입니까?

분류에서Dev

양식 내부의 버튼을 해당 행의 하위 항목으로 업데이트하는 방법

분류에서Dev

Pandas 데이터 프레임의 다른 열 값을 기반으로 'Balance'열을 업데이트하는 방법

분류에서Dev

Eclipse에서 멀티 모듈 프로젝트 버전을 업데이트하는 편리한 방법

분류에서Dev

ember.js를 버전 2.0.1로 업데이트하는 방법

분류에서Dev

Orchard 맞춤 모듈 버전을 업데이트하는 방법

분류에서Dev

Cordova에서 앱 버전을 업데이트하는 방법

분류에서Dev

pitclipse 플러그인에 사용 pitest의 버전을 업데이트하는 방법이 있나요?

분류에서Dev

CentOS Ant 버전을 1.8.x 이상으로 업데이트하는 방법은 무엇입니까?

분류에서Dev

사용자 정의 전환의 일부로 StatusBar 스타일을 업데이트하는 방법

분류에서Dev

Postgres에서 업데이트하기 전에 특정 열의 기록을 저장하는 저장 프로 시저를 만드는 방법

분류에서Dev

asdf의 버전을 버전으로 얻는 방법

분류에서Dev

PostgreSQL에서 8 백만 행의 데이터로 테이블의 한 열을 업데이트하는 방법

분류에서Dev

DB2의 단일 업데이트 문에서 여러 열을 업데이트하는 방법

Related 관련 기사

  1. 1

    다른 열을 기반으로 다음 n 행의 평균 값을 계산하는 방법-SQL (Oracle)-이전에 답변 한 질문의 업데이트 버전

  2. 2

    결과 집합의 이전 행을 기반으로 열 데이터를 업데이트하는 방법

  3. 3

    원래 값으로 전달 된 함수의 출력으로 DB의 모든 행의 특정 열 값을 업데이트하는 방법.

  4. 4

    Nhibernate로 행을 업데이트하는 방법

  5. 5

    Internet Explorer 11을 버전 11.1155.15063.0으로 업데이트하는 방법

  6. 6

    Fedora에서 npm을 최신 버전으로 업데이트하는 방법

  7. 7

    Ubuntu 18.04에서 Python을 최신 버전으로 업데이트하는 방법

  8. 8

    Java 런타임 버전을 7에서 8로 업데이트하는 방법

  9. 9

    다른 열의 값을 기반으로 열을 업데이트하는 방법

  10. 10

    데이터 프레임 파이썬의 이전 행을 기반으로 행을 업데이트하는 방법

  11. 11

    npm 버전을 호출하는 방법 (내 패키지의 버전을 업데이트 한 다음 커밋)

  12. 12

    SQL에서 4 개의 열로 열을 업데이트하는 방법

  13. 13

    번들을 사용하여 Rails 저장소에서 로컬로 복제 된 heroku ruby의 gem 버전을 업데이트하는 방법은 무엇입니까?

  14. 14

    요리 책을 최신 버전으로 안전하게 업데이트하는 방법은 무엇입니까?

  15. 15

    Reducer 내부의 배열로 여러 값을 업데이트하는 방법

  16. 16

    Android 프로젝트의 업그레이드 버전을 테스트하는 방법은 무엇입니까?

  17. 17

    양식 내부의 버튼을 해당 행의 하위 항목으로 업데이트하는 방법

  18. 18

    Pandas 데이터 프레임의 다른 열 값을 기반으로 'Balance'열을 업데이트하는 방법

  19. 19

    Eclipse에서 멀티 모듈 프로젝트 버전을 업데이트하는 편리한 방법

  20. 20

    ember.js를 버전 2.0.1로 업데이트하는 방법

  21. 21

    Orchard 맞춤 모듈 버전을 업데이트하는 방법

  22. 22

    Cordova에서 앱 버전을 업데이트하는 방법

  23. 23

    pitclipse 플러그인에 사용 pitest의 버전을 업데이트하는 방법이 있나요?

  24. 24

    CentOS Ant 버전을 1.8.x 이상으로 업데이트하는 방법은 무엇입니까?

  25. 25

    사용자 정의 전환의 일부로 StatusBar 스타일을 업데이트하는 방법

  26. 26

    Postgres에서 업데이트하기 전에 특정 열의 기록을 저장하는 저장 프로 시저를 만드는 방법

  27. 27

    asdf의 버전을 버전으로 얻는 방법

  28. 28

    PostgreSQL에서 8 백만 행의 데이터로 테이블의 한 열을 업데이트하는 방법

  29. 29

    DB2의 단일 업데이트 문에서 여러 열을 업데이트하는 방법

뜨겁다태그

보관