2016-11-16 76 views
0

我正在使用實體框架6作爲我的ORM與SQL Server數據庫交談。我有兩個場景中插入新記錄時:如何在實體框架中有條件地生成DatabaseGenerated GUID

  1. 記錄的GUID是空的,在這種情況下,我在我的波蘇斯添加屬性

    DatabaseGenerated(DatabaseGeneratedOption.Identity)]

    我上面的ID字段,以及數據庫愉快地爲我的記錄生成一個新的順序GUID。

    這種情況最適合索引。我的客戶首先與試圖將記錄插入數據庫並使數據庫生成順序GUID的API對話。


  • 記錄的GUID已經被設置,其中,該GUID應在數據庫中設置的情況。但是,EF忽略這一點,並要求數據庫生成新的順序GUID。

    這種情況下,客戶端處於脫機狀態或其他方式無法訪問API。在這種情況下,它會使用自己生成的GUID在本地保存數據,然後嘗試將其保存到數據庫中。

  • 我已經做了一些搜索和似乎無法找到任何辦法只能有條件地問數據庫,生成一個新的GUID如果尚未設置。這可能嗎?

    謝謝!

    +0

    重複:http://stackoverflow.com/q/40598817/861716 –

    +0

    如果你不會找到更好的方法,一個選項是自己生成順序guid(例如:http://stackoverflow.com/q/211498/5311735) – Evk

    回答

    0

    是的。使用方法EF

    的AddOrUpdate見AddOrUpdate

    +0

    我剛纔試過這個。沒有太多細節可以繼續,但我對如何使用該方法進行了一些研究。它似乎並沒有工作。 – derf26

    +0

    你能解釋AddOrUpdate如何幫助嗎?這是一個僅有鏈接的答案,可能會被審覈流程刪除。 –

    0

    在同一時間不能兼得。在這種情況下,您正在配置EF,以便每次插入記錄時讓數據庫創建一個新的ID,EF將始終這樣做。當記錄作爲插入被追蹤時,它總是會遵循這種行爲。

    您需要一種方法來跟蹤哪些實體無法到達要插入的服務器,以及客戶端應用程序聯機時是否能夠同步這些更改。

    我會創建一個不同的本地數據關係,這將允許跟蹤您本地存儲中的實體。它需要多一點努力,但值得付出努力。

    +0

    我在想這樣做的一種方式是讓所有本地存儲的關係通過本地GUID工作,稱爲「LocalTransactionId」,並且有一個單獨的(唯一的,但可以是空的而不是主鍵)由該服務器稱爲「ServerTransactionId」。如果記錄可以成功插入到服務器的數據庫中,那麼兩者將被設置爲相同,如果不是,那麼它們將會不同。無論如何,EF使用本地ID來處理所有本地關係,並且客戶端使用服務器ID來與API /服務器進行通信。思考? – derf26

    +0

    在上面的示例中,服務器只會知道ServerTransactionId,而客戶端將同時擁有LocalTransactionId和ServerTransactionId。 – derf26

    +0

    這可能是實現它的一種方式。請記住,您不想使用在服務器端沒有意義的屬性來玷污服務器實體。在你的反序列化中尋找一種方法來刪除它們。 –