2013-03-26 58 views
2

我一直沒能找到我的問題的任何適當的解決方案,所以這裏是我對你的問題:自動增量在實體框架5,而不在數據庫中標識列

在實體框架(5.0),我怎麼能建立一個在實際數據庫(SQL Server 2005)中沒有定義標識列時自動創建ID列(PK)?

我已經看到了StoreGeneratedPattern,但不知道如何在數據庫中沒有標識的情況下工作。手動方法是用MAX(id)+1手動填充POCO,但感覺像是黑客,我擔心它會在多線程環境中引入問題,多線程環境中多個請求可能會將記錄插入到我的表中同一時間。

請注意,我沒有可能更改數據庫中的表模式。

解決此問題的最佳方法是什麼?

+0

爲什麼你不想首先使用標識列? – Thewads 2013-03-26 12:52:20

+1

當然,我想使用標識列,但由於多種原因,我無法更改數據庫中的表結構,例如,這會破壞我無法控制的其他軟件的功能。 – anve 2013-03-26 15:23:11

回答

0

如果您的應用程序的一個實例是向此表中插入行的唯一實例,那麼MAX(Id) + 1黑客可能已經足夠好了。否則,您需要更改數據庫模式以在插入時生成這些值 - 可以使用IDENTITY或使用觸發器,sprocs等重新創建輪子。

無論您的解決方案如何,都應該保證重複密鑰永遠不會生成 - 即使事務發生回滾一個或多個插入。

如果沒有其他內容插入到表中,您應該能夠將Id更改爲標識列而不破壞兼容性。

FYI:實體框架的StoreGeneratedPattern(或DatabaseGeneratedOption)只規定值的方式在插入和更新處理。使用Identity告訴EF該值預計將由數據庫在插入時生成。 Computed表示它在插入和更新時生成。

+0

感謝您對Brice的澄清,這是我所期望的。在我的情況下,「MAX(id)+1 hack」將不夠用,因爲我的應用程序的多個實例可能會插入到此表中。 **想法:**如果我將所有邏輯從應用程序代碼移動到存儲過程並在事務中執行「MAX(id)+1」,您認爲這樣做足夠了還是需要在桌子上放一些鎖? – anve 2013-03-26 18:34:38

+0

@anve,我不確定最好的方法是什麼。就我個人而言,我會通過將IDENTITY添加到列來更詳細地調查究竟是什麼樣的突破。你可能想問一個針對SQL Server社區的新問題; EF似乎不再是這個難題的相關部分。 – bricelam 2013-03-26 20:30:48

相關問題