首页 新闻 会员 周边

那些ENTITY FRAMEWORK中流逝的ID

0
悬赏园豆:5 [已解决问题] 解决于 2014-08-26 09:25

在Entity Framework的使用过程中,总会发现数据表的ID突然暴涨,请问有什么办法解决?

 

暴涨的现象:一个表的ID只使用了1-4,突然某一天再添加数据的时候,新的数据ID变成了1004,有999的损耗。

 

在实际使用中,这个表的实体对象是没提供insert功能的,只是用于关联到别的实体使用,所有的数据增删改功能都是直接在数据表的编辑状态实现。

 

可以确认:没有对这个数据表做过任何的删除记录操作(即便偶尔有,也不可能出现999的损耗啊) 

519740105的主页 519740105 | 大侠五级 | 园豆:5810
提问于:2014-08-05 10:21
< >
分享
最佳答案
0

数据库不会保证自增ID能够顺序下来的,也就是中间可能会跳过,和Entity Framework没什么关系

这个是数据库的处理机制问题,数据库会预先把之后1000个ID拿出来备用,如果插入,将依次把备用的ID用上,但是数据库内部的记录已经变为了1000,如果重启了数据库,那么再次添加的时候,就会从1001开始

收获园豆:2
诶碧司 | 小虾三级 |园豆:1912 | 2014-08-06 01:30

你这个说法很有参考性,但是~~~在我准备进行实验时,突然想起别的没被EF操作过的数据表是没有这样的问题的。

 

问题还是应该出现在EF中,比如执行了INSERT,却又失败了。

519740105 | 园豆:5810 (大侠五级) | 2014-08-07 10:36
其他回答(3)
0

用下面的命令重置一下自增ID试试:

DBCC CHECKIDENT (表名, RESEED, 1)
收获园豆:1
dudu | 园豆:31007 (高人七级) | 2014-08-05 10:28

重置的结果是把ID进行了整理吧?但在实际中可能不现实,因为不经意间,这个数据就猛跳了,而什么时候跳却抓不住。

我曾对数据表增加触发器来捕抓insert和delete的行为,结果没捕抓到,估计是数据表(实体)关联中导致的数据更新或添加引起的这个问题,所以,想从根本上来解决这个问题。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-05 10:31

@519740105: 建议SQL Profiler抓一下insert/delete行为

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2014-08-05 10:33
0

表示不用自增ID已经N年的飘过...

收获园豆:1
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-08-05 10:39

ID有时还是用自增的好。当然,从ID着手,解决的办法可以使用guid来达到目的。

但我这里要处理的是,EF里怎么会有这样的BUG?又该怎么解决?

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-05 10:41

@519740105: 

还有一种解决方法是,不用自增ID,用Integer,反正你不用实体进行增加操作,其实就算用实体进行增加操作,你又比较Care 不要跳数字,那就自己计算下一个ID,何必让系统自动增加呢?

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-08-05 10:49

@爱编程的大叔: 你还是没明白我的意思:

我是奇怪EF怎么会有这个BUG以及这个BUG该如何解决。并非针对业务本身的需求来解决,而是针对问题的本身来探讨,纯粹是属于纯技术讨论。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-05 10:56
1

我深度的怀疑 你的查询 没有用这个.AsNoTracking();

同时 很可能这个实体 还做了父子表的级联查询(就是在父类里面挂了一个子类)

带来的问题是什么呢 你在更新父类的时候 会连带着更新子类

而你子类因为有些限制 而无法插入 可能是id 或者其他的 所以导致sql对这张表执行过 insert语句 但是没有成功

但是却执行了 这个操作 直接导致 id 自增 而你在外部一点都发现不了

收获园豆:1
小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2014-08-05 11:19

对EF而言,我是一个绝对的菜鸟。 

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-08-05 11:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册