Использование хранимой процедуры и NHibernate для вставки записи - PullRequest
1 голос
/ 22 июня 2010

Обычно параметризованный SQL прекрасно работает для CRUD, но у меня есть один случай, когда я хочу использовать хранимую процедуру для вставки.

Мой файл 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-insert соответствует количеству свойств и отношений «многие-к-одному» (для идентификатора не существует вопросительного знака).

Я получаю следующее исключение.Если я переключаю генератор на «инкремент», он работает, но я не хочу этого делать, поскольку другим процессам разрешено сохранять данные в базе данных.

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 Ответ

1 голос
/ 22 июня 2010

Хранимая процедура должна возвращать сгенерированный идентификатор для вставленной записи, то есть SELECT SCOPE_IDENTITY() в конце sproc, если вы используете SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...