Entity framework 实体框架集标识\u插入

Entity framework 实体框架集标识\u插入,entity-framework,entity-framework-4,Entity Framework,Entity Framework 4,当我们有一个自动递增的ID列,即通过EF使用SET IDENTITY_INSERT行为时,是否有办法强制EF中新实体的ID值 我们的要求是,我们的创建表单在填充或保存之前,必须始终为我们在空表单上创建的对象显示一个新的、唯一的ID。这个想法是,这个ID可以通过电话读出给某人,然后用户可以在通话结束后填写并保存表单。我们可以通过在数据库中插入一个空行来保留ID,但我们有唯一的列和FK;取而代之的是,我创建了一个“nextid”表,为了安全起见,我们使用锁递增它,我还对对象表中的top ID进行了测

当我们有一个自动递增的ID列,即通过EF使用SET IDENTITY_INSERT行为时,是否有办法强制EF中新实体的ID值

我们的要求是,我们的创建表单在填充或保存之前,必须始终为我们在空表单上创建的对象显示一个新的、唯一的ID。这个想法是,这个ID可以通过电话读出给某人,然后用户可以在通话结束后填写并保存表单。我们可以通过在数据库中插入一个空行来保留ID,但我们有唯一的列和FK;取而代之的是,我创建了一个“nextid”表,为了安全起见,我们使用锁递增它,我还对对象表中的top ID进行了测试,以防出错。当时的想法是,当我们写回实体时,强制使用这个新ID——但我不知道如何让EF这样做

这可能吗?这只是我错过了什么吗?我甚至不认为ID可以用于insert,所以我不认为在SaveChanges周围手动调用SET IDENTITY_insert会有所帮助

还是我必须做点别的?我可以看到其他选择:

  • 将我们的ID列更改为非标识,并对其进行手动控制:这里有一个表ID继承,因此这可能也很棘手

  • 将DB ID和用户可见ID分离到一个单独的列中,并在其中记录我们的唯一ID
  • 空行保留ID,如上所述;可能需要一些可空性更改,并修改数据读取代码以忽略这些记录

谢谢!这是EF4(使用EDMX和生成的类而不是POCOs),如果有必要的话,这是针对SQL Server 2008的。

为什么不使用Guid作为主键呢。与自动增量无关,没有并发陷阱等。您只需在创建表单时创建Guid。把它交给打电话的人,然后填写表格。当表格被取消时,没问题。表单完成后,使用创建的Guid创建实体并设置实体对象的其他值,将其应用于(a)上下文和SaveChanges()…

不会改变模式的备选方案

  • 使用EF事务
  • 您可以调用context.SaveChanges()并获取自动递增的主键。流程完成后,您可以提交事务。如果事务被取消或出现错误/异常,您可以随时回滚,这样您的行中就不会有漏洞/脏数据。我建议您使用单例模式,并将相同的事务/上下文传递给任何方法或屏幕以完成该过程

  • 只需添加一个附加状态:草稿

  • 使用保存的ID将空表单另存为草稿,然后继续使用信息编辑表单。完成后,将表格另存为最终/准备就绪。如果您不打算继续保存表单,您可以随时回收草稿。

    谢谢。但是,ID必须向人读取,因此越简单越好。我看不出在一个新列中使用单独的递增数字(这是一个我已经解决的问题)有什么好处:我们仍然需要修改所有的搜索+查找代码来搜索新值,等等。如果您指的是表主键,那么这个表就有FKR(加上我提到的ID继承)因此,我宁愿将其保留为整数-除了随机性,我在这里没有看到任何优势。请确保不要让它成为表上的群集键-这将是非常低效的,并且对数据库非常有害..我现在更清楚地看到了问题…当ID由EF创建并且位于主键中时,这是不可能的我想,如果以后要更改它……可能当您从上下文中分离实体时……我使用自跟踪实体……可以通过停止跟踪实体来更改主键中的值。不过很难!“将DB ID和用户可见ID分离到一个单独的列中,并在其中记录我们的唯一ID。”->可能是最好的方法!保证ID的唯一方法是插入它——使用
    SET IDENTITY insert
    不会解决在切换回功能以处理约束之前处理潜在重复项的问题。这真的只是一个需要序列号的问题吗?@OMG Ponies是的,也许这终究是一条路要走。但是,要插入的重复ID肯定是例外情况-我们反馈的顺序新ID是在不同的表中生成的,带有锁等。因此,除非出现意外错误,否则ID将是唯一的。如果您自己确定新值-您需要
    标识
    规范做什么,如果是这样的话???@marc_,我想我们真的不知道,但这是对一个已经构建的系统的一个增强,我希望将对现有内容的更改保持在最低限度。