在sql-insert中使用自定义的存储过程
在NHibernate 1.2中可以通过<sql-insert></sql-insert>来自定义添加操作的SQL语句,自然也能使用存储过程。下面小奎就总结一下,在NHibernate中使用自定义存储过程来进行添加要注意的几点。
第一是在<sql-insert></sql-insert>中写入exec ProcName.这一步就不用费话了。
第二个要说的是参数。参数是按照你定义property的顺序自动填充的。所以,如果有一些属性不要传递到传递到存储过程中,一定记得标上insert="false"告诉NHibernate一下。ID会做为最后一个参数传递给存储过程,这一点要特别注意,写存储过程也要注意这一点。
第三个要注意的地方是generator的设置。这个一定要设置成assigned。否则的话,存储过程不会调用,NHibernate会自动生成SQL语句来完成添加操作。
还有一点是第三点设置引起的。当generator设置成assigned时记得一定要将id字段设置成一个大于0的数字(如果是ID是数据型的话)。否则保存操作将不能将对象保存到数据库。还有一点是如果generator设置成assigned,保存操作要放到一个事务中执行,否则也不能将它提交到数据库。这个主要是当generator设置成assigned时,ISession.Save(object)操作,并不会真正触发数据库操作,而是会等事务的ITransaction的Commit方法被执行才会真正触发数据库操作。如果不放到事务中执行,就在调用ISession.Save方法后,调用一下iSession.Flush方法。
第一是在<sql-insert></sql-insert>中写入exec ProcName.这一步就不用费话了。
第二个要说的是参数。参数是按照你定义property的顺序自动填充的。所以,如果有一些属性不要传递到传递到存储过程中,一定记得标上insert="false"告诉NHibernate一下。ID会做为最后一个参数传递给存储过程,这一点要特别注意,写存储过程也要注意这一点。
第三个要注意的地方是generator的设置。这个一定要设置成assigned。否则的话,存储过程不会调用,NHibernate会自动生成SQL语句来完成添加操作。
还有一点是第三点设置引起的。当generator设置成assigned时记得一定要将id字段设置成一个大于0的数字(如果是ID是数据型的话)。否则保存操作将不能将对象保存到数据库。还有一点是如果generator设置成assigned,保存操作要放到一个事务中执行,否则也不能将它提交到数据库。这个主要是当generator设置成assigned时,ISession.Save(object)操作,并不会真正触发数据库操作,而是会等事务的ITransaction的Commit方法被执行才会真正触发数据库操作。如果不放到事务中执行,就在调用ISession.Save方法后,调用一下iSession.Flush方法。