通常参数化的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中的问号数量与属性数量和多对一关系相匹配(Id没有问号)。
我收到以下异常。如果我将生成器切换为“递增”它可以工作,但我不想这样做,因为允许其他进程保存到数据库。
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)
有什么建议吗?感谢。
答案 0 :(得分:1)
如果您正在使用SQL Server,则存储过程必须返回插入记录的生成ID,即在sproc末尾的SELECT SCOPE_IDENTITY()
。