2010-06-22 3 views
1

일반적으로 매개 변수화 된 SQL은 CRUD에 적합하지만 저장 프로 시저를 사용하여 삽입을 수행하려는 인스턴스가 하나 있습니다.저장 프로 시저와 NHibernate를 사용하여 레코드 삽입

내 HBM 파일은

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="MyProject.Entities" assembly="MyProject"> 
    <class name="MyProject.Entities.Policy, MyProject" table="dbo.Policy" lazy="true"> 
    <id name="Id" column="[PolicyId]"> 
     <generator class="native" /> 
    </id> 
    <sql-insert>exec spInsertPolicy ?,?,?,?,?,?,?</sql-insert> 
    </class> 
</hibernate-mapping> 

는 SQL-삽입에 물음표의 수는 속성과 여러 대의 수를 일치 (다른 속성, 가방 등의 무리와 함께) 다음있다 하나의 관계 (이드에게는 물음표가 없다).

다음 예외가 발생합니다. 발전기를 "증가"로 전환하면 작동하지만 다른 프로세스가 데이터베이스에 저장하도록 허용하기 때문에 생성기를 원하지 않습니다.

NHibernate.HibernateException: The database returned no natively generated identity value 
     at NHibernate.Id.IdentifierGeneratorFactory.GetGeneratedIdentity(IDataReader rs, IType type, ISessionImplementor session) 
     at NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand insert, ISessionImplementor session) 
     at NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder) 
     at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Boolean[] notNull, SqlCommandInfo sql, Object obj, ISessionImplementor session) 
     at NHibernate.Persister.Entity.AbstractEntityPersister.Insert(Object[] fields, Object obj, ISessionImplementor session) 
     at NHibernate.Action.EntityIdentityInsertAction.Execute() 
     at NHibernate.Engine.ActionQueue.Execute(IExecutable executable) 
     at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess) 

의견이 있으십니까? 감사.

답변

1

SQL Server를 사용하는 경우 저장 프로 시저에서 삽입 된 레코드의 생성 된 ID 즉, SELECT SCOPE_IDENTITY()을 sproc의 끝에 반환해야합니다.

+0

나는 저장 프로 시저를 실행 한 후 NHibernate에 의해 자동으로 호출 될 것이라고 생각했다. 당신이 락! – Eric

관련 문제