如何在Entity Framework 4中获取SQL 2008的下一个主键

时间:2011-08-12 09:35:35

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

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

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

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

我找不到任何方法,例如Item.ID.GetNextIdentity()或类似的东西,并查看了很多这样的类似问题,但无济于事。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:0)

非常同意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
            }
        }

答案 2 :(得分:-1)

DBCC CHECKIDENT ( table_name, NORESEED )

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