2017-03-27 20 views
2

一個新的實體,我們有一個實體,角色,標有屬性[DatabaseGenerated(DatabaseGeneratedOption.None)。到目前爲止,我們已經使用種子將實體種入數據庫。但是現在我們要創建一個新頁面讓用戶添加/更新角色。將新的實體添加到數據庫的正確方法是什麼? 實體框架會自動執行嗎?或者我首先需要獲取最大id(一個簡單的int列)並將其設置在新實體上?如果是這樣,在併發性方面是否安全?有沒有一種正確的方法可以保證安全?如何添加標有[DatabaseGenerated(DatabaseGeneratedOption.None)

回答

1

Is there a right way to be concurrency safe?

既然你明確說明

[DatabaseGenerated(DatabaseGeneratedOption.None)] 

您禁用併發安全數據庫自動生成的ID的(主鍵/身份)。

那麼你的選擇是:

  • 啓用數據庫生成的ID的
  • 使用自然鍵
  • 花費了大量的時間創建一個行爲像數據庫自動生成的ID的系統。
  • 你可以做的另一件事就是將PK改爲uniqueidentifier,但是如果你有FK關閉,那麼這樣做效果不好。然後你可以創建一個插入的新GUID,而不用擔心它。 (@Daniel Lorenz的建議,看評論)

實體框架在這裏沒有太多的幫助。 也許你可以詳細說明爲什麼數據庫生成的ID被禁用。

+0

我們需要有一些表格(比如我的文章中的Roles表格)填充了與其他舊錶格中的值匹配的值。現在我們需要能夠向其中的一些添加新行。順便說一句,這些表仍然有一個主鍵,名爲ID,它只是不是一個標識列。 – ashilon

+0

你可能想檢查這個帖子,我認爲你可以嘗試的最好的辦法是暫時禁用Id生成,插入你的行重新啓用它。我不知道如何重置種子(身份號碼),但我認爲這將是最簡單的選擇。重新創建自動數據庫標識插入可能是大型複雜項目中的一大難題。如果它很小,可以鎖定它,獲取並插入最高的+1。它會工作。 http://stackoverflow.com/questions/13086006/how-can-i-force-entity-framework-to-insert-identity-columns – Stefan

+0

你可以做的另一件事就是將PK改爲uniqueidentifier,但如果你有FK關閉,那麼這將不會工作得很好。然後你可以創建一個插入的新GUID,而不用擔心它。 –

2

如果使用SqlBulkCopy類來播種數據,則可以使用數據庫自​​動生成的id,從而使您可以使用兩全其美(這對於播種大量數據也更有效)。