在Entity Framework的使用过程中,总会发现数据表的ID突然暴涨,请问有什么办法解决?
暴涨的现象:一个表的ID只使用了1-4,突然某一天再添加数据的时候,新的数据ID变成了1004,有999的损耗。
在实际使用中,这个表的实体对象是没提供insert功能的,只是用于关联到别的实体使用,所有的数据增删改功能都是直接在数据表的编辑状态实现。
可以确认:没有对这个数据表做过任何的删除记录操作(即便偶尔有,也不可能出现999的损耗啊)
数据库不会保证自增ID能够顺序下来的,也就是中间可能会跳过,和Entity Framework没什么关系
这个是数据库的处理机制问题,数据库会预先把之后1000个ID拿出来备用,如果插入,将依次把备用的ID用上,但是数据库内部的记录已经变为了1000,如果重启了数据库,那么再次添加的时候,就会从1001开始
你这个说法很有参考性,但是~~~在我准备进行实验时,突然想起别的没被EF操作过的数据表是没有这样的问题的。
问题还是应该出现在EF中,比如执行了INSERT,却又失败了。
用下面的命令重置一下自增ID试试:
DBCC CHECKIDENT (表名, RESEED, 1)
重置的结果是把ID进行了整理吧?但在实际中可能不现实,因为不经意间,这个数据就猛跳了,而什么时候跳却抓不住。
我曾对数据表增加触发器来捕抓insert和delete的行为,结果没捕抓到,估计是数据表(实体)关联中导致的数据更新或添加引起的这个问题,所以,想从根本上来解决这个问题。
@519740105: 建议SQL Profiler抓一下insert/delete行为
表示不用自增ID已经N年的飘过...
ID有时还是用自增的好。当然,从ID着手,解决的办法可以使用guid来达到目的。
但我这里要处理的是,EF里怎么会有这样的BUG?又该怎么解决?
@519740105:
还有一种解决方法是,不用自增ID,用Integer,反正你不用实体进行增加操作,其实就算用实体进行增加操作,你又比较Care 不要跳数字,那就自己计算下一个ID,何必让系统自动增加呢?
@爱编程的大叔: 你还是没明白我的意思:
我是奇怪EF怎么会有这个BUG以及这个BUG该如何解决。并非针对业务本身的需求来解决,而是针对问题的本身来探讨,纯粹是属于纯技术讨论。
我深度的怀疑 你的查询 没有用这个.AsNoTracking();
同时 很可能这个实体 还做了父子表的级联查询(就是在父类里面挂了一个子类)
带来的问题是什么呢 你在更新父类的时候 会连带着更新子类
而你子类因为有些限制 而无法插入 可能是id 或者其他的 所以导致sql对这张表执行过 insert语句 但是没有成功
但是却执行了 这个操作 直接导致 id 自增 而你在外部一点都发现不了
对EF而言,我是一个绝对的菜鸟。