4

我們目前有沒有主鍵身份的表。由於互操作性的緣故,改變這一點將代價太高。處理非身份主鍵的生成

我在考慮處理ObjectContext的SavingChanges事件來設置它的值。

(僞)

void SavingChanges(context) 
{ 
    foreach (var entity in context) 
    { 
     if (entity.HasIdentity) continue; 

     entity.PrimaryKey = GetNextPrimaryKey(entity.Type); 
    } 
} 

我只能想到用一個單獨的連接來實現這一點。是的,GetNextPrimaryKey會減少往返次數,但我認爲解釋整體想法是十分恰當的。

它會工作嗎?我應該嘗試不同的東西嗎?

+0

我認爲它應該工作。 – 2011-02-23 14:03:59

+0

我想我應該做一個尖峯:) – 2011-02-25 02:12:40

回答

0

這取決於方法GetNextPrimaryKey中的邏輯。

如果您的方法在多個線程中執行,那麼您將有機會將相同的鍵分配給多個對象。

Buti如果你的GetNextPrimaryKey提前你的密鑰並且總是返回一個新的密鑰,不管它是否被使用,那麼沒有問題。

但是,如果您的邏輯只是查找上次使用的密鑰並執行key + 1,那麼在多線程情況下或Web應用程序中,您將發生衝突。

最好是使用某種存儲過程,並始終從SP返回一個新的密鑰,所以在並行執行GetNextPrimaryKey的情況下不會有任何問題。