Entity framework 实体框架集标识\u插入
当我们有一个自动递增的ID列,即通过EF使用SET IDENTITY_INSERT行为时,是否有办法强制EF中新实体的ID值 我们的要求是,我们的创建表单在填充或保存之前,必须始终为我们在空表单上创建的对象显示一个新的、唯一的ID。这个想法是,这个ID可以通过电话读出给某人,然后用户可以在通话结束后填写并保存表单。我们可以通过在数据库中插入一个空行来保留ID,但我们有唯一的列和FK;取而代之的是,我创建了一个“nextid”表,为了安全起见,我们使用锁递增它,我还对对象表中的top ID进行了测试,以防出错。当时的想法是,当我们写回实体时,强制使用这个新ID——但我不知道如何让EF这样做 这可能吗?这只是我错过了什么吗?我甚至不认为ID可以用于insert,所以我不认为在SaveChanges周围手动调用SET IDENTITY_insert会有所帮助 还是我必须做点别的?我可以看到其他选择: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列更改为非标识,并对其进行手动控制:这里有一个表ID继承,因此这可能也很棘手
- 将DB ID和用户可见ID分离到一个单独的列中,并在其中记录我们的唯一ID
- 空行保留ID,如上所述;可能需要一些可空性更改,并修改数据读取代码以忽略这些记录
谢谢!这是EF4(使用EDMX和生成的类而不是POCOs),如果有必要的话,这是针对SQL Server 2008的。为什么不使用Guid作为主键呢。与自动增量无关,没有并发陷阱等。您只需在创建表单时创建Guid。把它交给打电话的人,然后填写表格。当表格被取消时,没问题。表单完成后,使用创建的Guid创建实体并设置实体对象的其他值,将其应用于(a)上下文和SaveChanges()…不会改变模式的备选方案
使用保存的ID将空表单另存为草稿,然后继续使用信息编辑表单。完成后,将表格另存为最终/准备就绪。如果您不打算继续保存表单,您可以随时回收草稿。谢谢。但是,ID必须向人读取,因此越简单越好。我看不出在一个新列中使用单独的递增数字(这是一个我已经解决的问题)有什么好处:我们仍然需要修改所有的搜索+查找代码来搜索新值,等等。如果您指的是表主键,那么这个表就有FKR(加上我提到的ID继承)因此,我宁愿将其保留为整数-除了随机性,我在这里没有看到任何优势。请确保不要让它成为表上的群集键-这将是非常低效的,并且对数据库非常有害..我现在更清楚地看到了问题…当ID由EF创建并且位于主键中时,这是不可能的我想,如果以后要更改它……可能当您从上下文中分离实体时……我使用自跟踪实体……可以通过停止跟踪实体来更改主键中的值。不过很难!“将DB ID和用户可见ID分离到一个单独的列中,并在其中记录我们的唯一ID。”->可能是最好的方法!保证ID的唯一方法是插入它——使用
SET IDENTITY insert
不会解决在切换回功能以处理约束之前处理潜在重复项的问题。这真的只是一个需要序列号的问题吗?@OMG Ponies是的,也许这终究是一条路要走。但是,要插入的重复ID肯定是例外情况-我们反馈的顺序新ID是在不同的表中生成的,带有锁等。因此,除非出现意外错误,否则ID将是唯一的。如果您自己确定新值-您需要标识规范做什么,如果是这样的话???@marc_,我想我们真的不知道,但这是对一个已经构建的系统的一个增强,我希望将对现有内容的更改保持在最低限度。