【问题标题】:Entity Framework SaveChanges Fail increment identity column实体框架 SaveChanges 失败增量标识列
【发布时间】:2014-10-02 15:53:00
【问题描述】:

我对执行SaveChanges 方法时Entity Framework 的行为有疑问。

我有一个具有身份列的实体,并且刚刚意识到,如果我调用SaveChanges(用于新插入)并且它失败了,那么我的数据库中的身份列就会增加.

我曾经让 Identity 列的值等于 7,而我正在调试我的代码,SaveChanges 方法失败了 5 次,因为我错过了插入所需的值,当它解决时我注意到我的 identity 列值现在是 13 岁。

这是正常行为吗?当实体框架无法提交到我的数据库时,有没有办法避免增加标识列的值?

感谢任何帮助

【问题讨论】:

  • 这与EF无关,当在具有标识的表上任何插入失败时,它无论如何都会递增,只需在sql management studio中尝试即可。你为什么在乎?
  • 好吧,很有趣。有没有办法避免这种行为或者是正常的?
  • 我不这么认为,它是一个设计功能。想象一个长事务开始,然后另一个事务开始,如果第二个事务必须等待第一个事务是否成功来确定它应该使用什么身份,那将是很糟糕的。正如我之前提到的,您为什么要关心您的 id 是否不连续?
  • @VAAA 我希望你不会采取错误的方式,但这是一种非常脆弱的方法,恕我直言,这是糟糕的设计。假设您继续执行此操作,并且在某些时候您必须由于删除而更新数字。所以上周的“Folio 8”现在是“Folio 7”。这不会让用户感到困惑吗?
  • 不要将行的标识与显示的行数混淆。如果 ID 为 13,则确保用户可以看到 13。如果您想显示序列号以获得用户体验,可以使用 Row_Number

标签: c# sql-server entity-framework


【解决方案1】:

这是 Sql 的行为,而不是实体框架。如果您不想浪费身份,您应该查看 Dbreseed 命令并为您的表执行它。检查这个所以问题RESEED identity columns on the database 如果我是你我不会有麻烦。而只是使用 Bigint 数据类型作为标识列

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-29
    • 2017-01-06
    相关资源
    最近更新 更多