2011-01-21 32 views
5

當我們有一個自動遞增的ID列,即通過EF使用SET IDENTITY_INSERT行爲時,是否有辦法強制EF中新實體的ID值?實體框架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以防萬一。

+1

保證ID的唯一方法就是插入它 - 使用「SET IDENTITY INSERT」進行播放不會解決事實上,在將功能切換回來處理約束之前,您將處理潛在的重複。這是否只是需要連續數字的問題? – 2011-01-21 17:22:37

+0

@OMG小馬Ye是的,也許這將是最終的出路。但是,插入的重複ID肯定會是異常情況 - 我們反饋的順序新ID是在具有鎖等的不同表中生成的,因此除非出現意外錯誤,否則將是唯一的。 – Rup 2011-01-21 17:25:53

回答

1

爲什麼不使用Guid作爲主鍵。與自動增量無關,沒有併發陷阱等。您只需在創建表單時創建Guid。將它交給呼叫者,然後填寫表格。當表格被取消時,沒問題。當表單完成創建與創建的Guid實體集的實體對象的其他價值,它適用於(一)上下文和調用SaveChanges()...

0

替代品不會改變您的架構

  1. 使用EF交易

你可以叫context.SaveChanges()並獲得自動增量主鍵。一旦過程完成,您可以提交交易。如果事務被取消或者存在錯誤/異常,您可以隨時回滾,以免在行中出現空洞/髒數據。我建議你使用單例模式並將相同的事務/上下文傳遞給任何方法或屏幕來完成該過程。

  • 只需添加一個額外的狀態:草稿
  • 保存空形式與保存的ID草案,然後進行編輯與該信息的形式。完成後,將表格保存爲最終/準備好。如果你不想繼續保存表格,你可以隨時回收草稿。