2011-01-07 4 views
4

나는 C# .net 4.0에서 작업 중이며 NHibernate를 사용하여 Oracle DB와 대화 중이다. 당신은 이미 어딘가에 있지만 이미 슬픔에 빠져있는 것처럼 간단하다고 생각할 것입니다. 오라클 시퀀스에서 NextVal이 필요합니다. ID 또는 기본 키의 일부로 데이터베이스를 삽입 할 필요가 없습니다. C# 측에서 다음 val을 사용해야합니다.NHibernate를 통해 oracle 시퀀스에서 NextVal을 얻는 방법

누군가가 XML 매핑과 C# 파일 (또는 링크)을 사용하여이를 해결할 수 있습니까?

감사합니다.

int NextValueOfSequence = GetNextValueofSequence(); 

public int GetNextValueOfSequence() 
{ 

// Access NHibernate to return the next value of the sequence. 

} 
+0

가있다 그냥 Id 속성에서 max를 실행 한 다음 1을 더하십시오. – Baz1nga

+0

아니요. DB에는 테이블이없고 SP도없고 오라클 시퀀스도 없다고 가정합니다. 나는 nextval을 얻어서 C# 측에서 사용해야한다. – trainer

답변

7

매핑 같은

뭔가 :

<sql-query name="GetSequence" read-only="true"> 
    <return-scalar type="Int64"/> 
    <![CDATA[ 
    SELECT SeqName.NEXTVAL from DUAL; 
    ]]> 
    </sql-query> 

코드 :이 또한 트릭을 수행

Int64 nextValue = session.GetNamedQuery("GetSequence").UniqueResult<System.Int64>(); 
+0

감사합니다. 매핑에서 구문 오류가 발생했습니다. 시간 제약으로 인해 조사/수정을 할 수 없었습니다. ............... <세션 변수> .CreateSQLQuery ("select your sequence> .NEXTVAL from dual")를 사용하여 끝났습니다. UniqueResult (); – trainer

+0

그러나 귀하의 의견에 감사 드리며, 표준 nhibernate 매핑/도메인 클래스 솔루션을 검색하는 대신 SQL 과정을 변경하는 데 도움이되었습니다. – trainer

+0

죄송합니다. 답변을 수정했습니다. 매핑에는 "return-scalar"가 있어야합니다. –

4

.

<your session variable>.CreateSQLQuery("select <your sequence>.NEXTVAL from dual").UniqueResult<Int64>(); 
0

작은 @Petr Kozelek에 의해 주어진 매핑 수정 난이 불가지론 ISession 확장 방법을 DB를 사용 NH4와

<sql-query name="GetSequence" read-only="true"> 
    <return-scalar column="NextNo" type="Int64"/> 
    <![CDATA[ 
     SELECT SeqName.NEXTVAL as NextNo from DUAL 
    ]]> 
</sql-query> 
4

는 (분명히 DB는 시퀀스를 지원해야합니다)

public static T GetSequenceNextValue<T>(this ISession session, string sequenceName) where T : struct 
{ 
    var dialect = session.GetSessionImplementation().Factory.Dialect; 
    var sqlQuery = dialect.GetSequenceNextValString(sequenceName); 
    return session.CreateSQLQuery(sqlQuery).UniqueResult<T>(); 
} 
관련 문제