2014-08-26 遇到的小问题

 

   不能快速的保存bug的确是很不爽的事情 ,不仅客户着急 领导也着急 ,自己也着急。。。。。。。。哈哈

   

   原来好好的一个平台 简单的一个插入记录 突然就报错了

   错误为 could not insert #9521

   原来项目是用 NHibernate 做的插入

   抛出的异常 真是无法定位到底是什么错误啊
   于是想打开vs调试下远程库 

   结果调试过程中 无法查询变量的值
   在调试即时窗口里  提示 表达式计算器中发生内部错误

   郁闷  于是重启vs

   又提示 源文件与模块生成时的不同

   网上搜了下解决方案  修改 调试 --》 选项 --》 常规里面 去掉 要求源文件与原始版本相匹配 ok 了

   调试过程中发现 

   -- 错误代码抛出的异常 为 直接的 Exception 查看了下 innerException 结果为

   "当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值“

   理论上来说 这个表的主键设置了 自增长,查了下 果然 服务器的表 与 测试的表 不符合 应该是有人改了数据库,
   只能是修改下 hbm.xml 文件 ok ,耗时一个半小时 ,

   时间主要浪费在 vs调试 这上面 ,错误没能够明显的抛出

    调试错误后 顺便总结下吧

    innerException  msdn的地址

   http://msdn.microsoft.com/zh-cn/library/system.exception.innerexception.aspx

    总的来说 抛出innerException 能更快的定位到错误,但并不是每个Exception 都会有 innerException

 

   再一个 vs 的 要求源文件与原始版本匹配 ,网上还有一个解决办法是 删除bin目录 重新生成 我没试
   找了下这样做可以的原因 应该是 pdb文件储存了项目的调试信息,可能与修改不符合

   关于 pdb 文件,还真没仔细研究过。

   pdb 文件  http://www.wintellect.com/blogs/jrobbins/pdb-files-what-every-developer-must-know

 

   nhibernate 主键

   

(1) assigned
主键由外部程序负责生成,无需NHibernate参与。

(2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主
键生成 历史状态。

 

<!--<generator class="hilo">
<param name="table">Tbl_Basic_Identity</param>
<param name="column">ProductVerifyMessageID</param>
<param name="max_lo">0</param>
</generator>-->

 

(3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史
状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

(4) increment
主 键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为 主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据
库,那么由于各个实例各自维护主键状态,不同实例可能生成同样
的 主键,从而造成主键重复异常。因此,如果同一数据库有多个实
例访问,此方式必须避免使用。

(5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL
中的主键 生成机制。

(6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的
Sequence。

(7) native
由 NHibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。) uuid.hex
由 Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后
以长度32 的字符串表示)作为主键。

(8) foreign
使用外部表的字段作为主键。

posted on 2014-08-26 14:58  havid  阅读(235)  评论(0编辑  收藏  举报

导航