【问题标题】:How can I get the next Primary Key for SQL 2008 in Entity Framework 4如何在实体框架 4 中获取 SQL 2008 的下一个主键
【发布时间】:2012-02-08 23:00:43
【问题描述】:

我正在使用 Entity Framework 4 连接来连接到 SQL 2008 服务器,以便为我的应用程序进行数据库处理。

我在 Visual Studio 2010 中使用 C#,我的问题是关于由 SQL 本身递增的主键字段,我是否有可能找到数据库接下来将使用的 ID。

我不能只找到最后一个项目和 +1 的原因是因为如果我的表包含项目 1、2、3、4 和 5,删除项目 5 然后添加另一个将使下一个项目成为项目 6,而不是5 再次(因为我在 SQL 中使用身份规范,但必须使用)。

我找不到任何方法,例如 Item.ID.GetNextIdentity() 或类似的方法,并且已经查看了许多类似的问题,但无济于事。

任何帮助将不胜感激

【问题讨论】:

  • 这个问题没有帮助吗? stackoverflow.com/questions/2958921/…
  • @Chris ,我在搜索时查看了它,它没有提到任何关于下一个键的内容,在我看来,问题和答案似乎是在谈论查找作为主键的字段,而不是将在该字段中使用的下一个主键。
  • 下一个ID要做什么?即使您找到了获取 ID 的方法,您也无法确定是 获得了 ID。
  • @Mikael ,我明白你的意思,我需要显示它的原因是因为将提交的表单需要显示将用作参考的 ID数字。 ID 不必显示,所以我可以暂时离开它,但将来我认为它可能是需要的。
  • 未来您可能希望了解下一个 SQL Server 版本中的新功能 (SEQUENCE)。这是@Aaron Bertrand 的一篇很棒的博客文章,其中还展示了一些如何在今天创建序列的技术。 sqlblog.com/blogs/aaron_bertrand/archive/2010/11/11/…

标签: c# sql-server visual-studio-2010 asp.net-mvc-3 entity-framework-4


【解决方案1】:

没有可靠的方法来使用自动递增的 ID 并在保存之前将其显示在表单中。那是错误的架构。如果您想在保存表单之前显示 ID,您必须:

  • 不使用自动递增的列作为 ID 并自己处理唯一性
  • 当用户开始在某些初始空状态下创建表单时立即保存表单,最终表单确认只会更新

为什么你不能要求下一个 ID?因为如果您以任何方式这样做,没有人会说收到的 ID 将真正用于您的表单。如果另一个进程/线程/应用程序在您的 ID 检索和表单持久性之间插入表单,您显示的 Id 将分配给该插入的表单。

此外,如果您在数据库中使用自动递增的主键,则无法在应用程序中分配键值 - 该值将不会被使用,数据库可以用自己的值覆盖它。

【讨论】:

    【解决方案2】:

    非常同意 Ladislav Mrnka 的观点,但可能需要这种功能。 一种绕过建议是:

            // Insert existing object in data base via EF, but PK is missing ...
            using (var Es = new MyEntities())
            {
                try
                {
                    // Allows you to get next pk
                    var e = new  Model.TableXXX();
                    // Set pk to existing entity which has no pk
                    existingEntity.PkField = e.PkField;
                    // Save existing object and let garbage collector take care
                    // of newly created entity
                    Es.TableXXX.AddObject(existingEntity);
                    Es.SaveChanges();
                }
                catch (Exception ex)
                {
                    // implement exception
                }
            }
    

    【讨论】:

      【解决方案3】:

      DBCC CHECKIDENT ( table_name, NORESEED )

      返回当前标识值和标识列的当前最大值。

      【讨论】:

      • 我需要使用实体框架 4 在我的应用程序的 C# 端执行命令并使用返回的值,似乎该命令是在 SQL 查询中完成,而不是在实体框架中完成。如果我可以通过 Entity Framework 4 做到这一点,我不知道怎么做,所以你必须告诉我。
      猜你喜欢
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多