2012-10-09 25 views
0

我有一個對象,比如Dog。對於每個狗,DB都會生成一個唯一的標識符 - ID。在對象上生成負面ID並防止整數溢出

但是,在將狗保存在數據庫之前,我應該生成一個臨時(負ID)。

因此,我在Class Dog中創建了一個shared(static)_lastId = 0。

在Dog的構造函數中,我只是遞減lastId。

但是,一旦我將狗保存在數據庫中,或者狗在垃圾收集器中「死亡」,則負號不再用於該對象,因此可以被其他狗使用,這些狗是活着但未保存的。

因爲最大整數= 2,147,483,647,如果我做了很多狗的我可能超過整數的最大極限的大名單的產生,supressions的...

Private Shared _LastId = 0 

Public Sub New() 
    Me.Id = _LastId - 1 

什麼「循環」 mecanism可能在這裏用來防止溢出?

+0

爲什麼你需要跟蹤_lastId?你使用它來確定最近插入的行的ID嗎? –

回答

1

三個選項

使用一個單獨的TempID是Int64的。

覆蓋Equals和==足夠聰明,可以使用TempID或ID。

但是,當對象獲得真實ID時,不要更改哈希值。

或者使用的Int64用於ID(臨時和實際)。
積極的一面,你碰巧只使用Int32。

落實處置上的狗,並給回-ID那裏。

當狗得到一個肯定的ID時,返回-ID。

擁有已回收-ID的HashSet,並在獲取新的-ID之前從該列表中取出。

+0

+1第三選項。 「Int64」不適合ID爲「Integer」的初始條件... – serhio

+0

爲什麼限制爲Int32 ID?數據庫中的Int32將適用於Int64。 – Paparazzi

+0

關於INT32的問題可以擴展到INT64,int64到int128等,我問到避免使用更大的數據類型的機制。 – serhio

0

爲什麼不保留默認值爲0的所有未保存的新對象? 甚至更​​好,使用NHibernate或Entity框架來處理這個ORM?

+0

由於對象由ID標識,因此兩個具有相似ID的對象將被視爲相似對象,因此不太好... – serhio

+0

如果您在POCOS中實現了Equals()並比較其他相關屬性,則不會。 看到這個: http://www.codeproject.com/Articles/20592/Implementing-IEquatable-Properly – Oscar

+0

沒有其他相關的屬性可用。 – serhio

0

只需重新回到-1,一旦你達到可能的最低值可能會滿足您的需求:

Public Sub New() 
    If _LastId > Interger.MinValue Then 
     Me.Id = _LastId - 1 
    Else 
     Me.Id = -1 
    End if 
    ' ... 
+0

我可能已經有-1,所以這將不是唯一的。 – serhio

+0

嗯,我根據你的問題假設,當你達到最小值時,最高溫度值已經釋放出來供再次使用。他們什麼時候可以重新使用?他們是按順序釋放的,還是在可用數量上留下空白?我不認爲將ID改爲GUID是可能的嗎?這顯然是這種設計的最佳解決方案。 –

+0

哇,如果狗只有100個字節,那麼200 GB的內存中的狗如果-1仍然在附近。 – Paparazzi