none
Entity Framework:如何避免ID的流逝? RRS feed

  • 问题

  • 环境:

    系统有多个entity,使用 int id 作为主键,自动递增量为 1,它们之间可能有关联。

    问题表现:

    有时,表的id值是连续递增的,但会在突然之间,ID值涨1000,而不是涨1。

    这个问题不是总是出现,只是偶尔出现。

    我怀疑是代码中有 实体的关联实体 新增,此时 实体新增成功,但关联实体(主实体)新增中遇到了异常,从而回滚数据导致的。

    但是,假如是我的这个怀疑,那么这个跳跃就不应该是恒定的1000,而我的数据库里出现这个问题的情状都是跳跃1000(999个ID流逝)。

    此外,我对这些有跳跃情况的数据表做了insert和delete的触发器,结果没有捕捉到任何数据。

    曾经问别的朋友,说是数据库重置导致的,我认可这个网友的说法,然后实验,结果不是这样。

    参考问题地址:

    那些ENTITY FRAMEWORK中流逝的ID

    谢谢!

    2014年9月2日 9:14

答案

  • Hello,

    >> 1、数据表的字段IDkey,取消起标识?

    你是你给你ID标识了: [DatabaseGenerated(DatabaseGeneratedOption.Identity)]? 如果是的话,光取消不行的还是identity, EF会自动将依稀ID/Id结尾的int类型的字段标为identity,需要标识成None.

    >> EFINSERT数据的时候,是能自动的获取insert后的ID(应该有一次查询),而采用手工设置ID的话,是否要进行多次的查询?

    你既然已经手工设置,那ID不是已经知道了啊,就是你给予的值。或者你是问在新增一条数据库是,要确定这个新增值得ID的话,那是要查询一次数据库的。

    >> 3、手工操作还容易导致数据ID的冲突

    我不知道你是怎么设置,按照以往的经验,如果你像确保数据不冲突的话,你可以在插入前做一个check,看这个ID是否已经存在了,当然这会牺牲一些程序的性能。

    >> 4、要进行关联定义,也要把关联的相关对象的ID获取吗?此时,如果获取(并锁定)后又不使用了,不还是存在类似问题?(只是此时没这么猛而已)。

    你说是在一对多的关系里在子类里获取要绑定的父类的ID吗,那是要的。我不是很明白你的说地获取后又不适用。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月4日 9:46
    版主

全部回复

  • Hello,

    像你提供的连接里有个人说用SQL Profiler来跟踪你的数据库执行记录,这个是就算是失败了的执行语句也会被记录下来的。

    还有就是不建议使用数据库自增的机制,有时候会出现一些奇怪的问题但是又不是很好troubleshooting。当前的问题就有可能是你程序中某个新增数据的代码块没有成功,这样虽然这个新增行为没有被提交到数据库,但是自增类还是会按照设定的步长累加的。

    你可以使用自己控制的自增,一般做法就是先去除数据库当前最大序列号,然后加1,赋予当前要新增的记录。即使是一个循环里也只要查询一次就够了。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月3日 2:50
    版主
  • 很感谢您的回答。

    我也曾考虑过这个问题,但如果这样的话,在EF里又应该怎么去解决以下问题(我在EF领域涉猎不深):

    1、数据表的字段ID是key,取消起标识?

    2、EF在INSERT数据的时候,是能自动的获取insert后的ID(应该有一次查询),而采用手工设置ID的话,是否要进行多次的查询?

    3、手工操作还容易导致数据ID的冲突

    4、要进行关联定义,也要把关联的相关对象的ID获取吗?此时,如果获取(并锁定)后又不使用了,不还是存在类似问题?(只是此时没这么猛而已)。

    2014年9月4日 7:00
  • Hello,

    >> 1、数据表的字段IDkey,取消起标识?

    你是你给你ID标识了: [DatabaseGenerated(DatabaseGeneratedOption.Identity)]? 如果是的话,光取消不行的还是identity, EF会自动将依稀ID/Id结尾的int类型的字段标为identity,需要标识成None.

    >> EFINSERT数据的时候,是能自动的获取insert后的ID(应该有一次查询),而采用手工设置ID的话,是否要进行多次的查询?

    你既然已经手工设置,那ID不是已经知道了啊,就是你给予的值。或者你是问在新增一条数据库是,要确定这个新增值得ID的话,那是要查询一次数据库的。

    >> 3、手工操作还容易导致数据ID的冲突

    我不知道你是怎么设置,按照以往的经验,如果你像确保数据不冲突的话,你可以在插入前做一个check,看这个ID是否已经存在了,当然这会牺牲一些程序的性能。

    >> 4、要进行关联定义,也要把关联的相关对象的ID获取吗?此时,如果获取(并锁定)后又不使用了,不还是存在类似问题?(只是此时没这么猛而已)。

    你说是在一对多的关系里在子类里获取要绑定的父类的ID吗,那是要的。我不是很明白你的说地获取后又不适用。

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年9月4日 9:46
    版主