2012-05-15 40 views
0

請耐心跟我解釋一下。實體框架存儲過程插入自定義序號

我有一個在EF4中使用映射存儲過程插入數據的表設置。

實施例:

id | location | type 
    1 |  10 | 15 
    5 |  10 | 16 

什麼SP所做的是在另一表中檢查按位置和類型相對應的下一個ID。

所以在這個例子中,下一個ID將是

  • 2位置10並鍵入15
  • 6位置10類型16

這是通過在EF映射的結果列。

它工作正常,除了當兩個不同的密鑰具有相同的序列號例如:

id | location | type 
    1 |  10 | 11 
    1 |  10 | 10 

編輯:當我在同一時間既創造新行出現此錯誤。

對他們倆的下一個值是2,將數據保存到數據庫中,但該應用程序失敗此消息:

到數據庫的更改被成功提交,但出現錯誤 而更新對象上下文。 ObjectContext可能處於 不一致狀態。
內部異常消息:
AcceptChanges無法繼續,因爲對象的鍵值與ObjectStateManager中的另一個 對象衝突。
在調用AcceptChanges之前,確保鍵值是唯一的。

有什麼建議嗎?

編輯 存儲過程示例

聲明@nextNumber詮釋

SELECT @nextNumber =值+ 1 FROM SEQUENTIAL_TABLE WHERE位置= @location和類型= @類型

INSERT INTO TABLE(位置,類型,ID,......)VALUES(@位置,@類型,@ nextnumber,.......)

UPDATE SEQUENTIAL_TABLE SET value = @nextNumber WHERE loca重刑= @location和類型= @型

SELECT @nextNumber爲[NextNumber]

+1

嘗試將僞造否定鍵分配給新實體。像-1,-2一樣,EF可以將它們分開。 –

回答

0

這聽起來像你誤使用id列不僅僅意味着「自動遞增的整數」。

+1

...應該是一條評論。 – spender

+0

你能解釋你的評論嗎?我添加了一個我正在使用的sp的示例。 –

+0

通常,有一列純粹是一行的唯一標識符。 (不幸的是,術語「唯一標識符是超負荷的,通常意味着」Guid「。我沒有使用這個定義,而只是」唯一「。)通常這個列被命名爲 Id或者只是Id。它出現在你的用例,Id列代表「位置/類型的順序」,並且沒有「唯一」列。 – robrich

1

不知道更多關於設計;您可以修改您的表,以便ID不是主鍵,而是使用該組ID /位置/類型作爲組合鍵。

+0

嗨 這就是它的設置方式,ID /位置/類型全部是關鍵 –

+0

ID也是無意中設置的數據庫作爲自己的主鍵? –

+0

不,唯一的PK是3的組合。 –

0

「假負數」是一個很棒的技巧,並且在DataSet/TableAdapter日子裏工作得非常好。如果這不起作用,也許這是一種競爭條件,並且您需要將細節放置在事務中,以便在您完成遞增和插入您的事務之前,沒有其他線程/行可以獲得下一個ID。