实体框架SET IDENTITY_INSERT

时间:2011-01-21 17:11:56

标签: entity-framework entity-framework-4

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

我们的要求是,在填写或保存之前,我们的创建表单必须始终为我们在空表单上创建的对象显示新的唯一ID。这个想法是这个ID可以通过电话向某人读取,然后用户可以在呼叫完成后完成并保存表单。我们可以通过在数据库中插入一个空行来保留ID然后,但是我们有唯一的列和FK;相反,我已经创建了一个“下一个ID”表,我们使用锁来增加安全性,并且我还要对照对象表中的顶部ID进行测试,这一点也要小心。我们的想法是在我们回写实体时强制使用这个新ID - 但我看不出如何让EF去做。

这可能 - 这只是我错过的东西吗?我认为这个ID甚至不会影响插入,所以我不认为在SaveChanges周围手动调用SET IDENTITY_INSERT会有所帮助。

或者我还要做别的事吗?我可以看到替代方案:

  • 将我们的ID列更改为不是身份并手动控制它:这里有一个表ID继承,所以这也很棘手。
  • 将DB ID和用户可见ID分隔到一个单独的列中,并在那里记录我们的唯一ID。
  • 清空行以保留ID,如上所述;可能需要一些可空性更改,并修改我们的数据读取代码以忽略这些记录。

谢谢!这是EF4(使用EDMX和生成的类而不是POCO),如果重要,则针对SQL Server 2008。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

不会改变您的架构的替代方案

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

    1. 只需添加其他状态:草稿
    2. 将空表单保存为包含已保存ID的草稿,然后继续编辑包含该信息的表单。完成后保存表格作为最终/准备好。如果您不继续保存表单,则可以随时回收草稿。