0

我有一个对象,说狗。对于每只狗,数据库都会生成一个唯一的标识符 - ID。

但在将 Dog 保存到数据库之前,我应该生成一个临时(负 ID)。

因此,我在类 Dog 中创建了一个共享(静态)_lastId = 0。

在 Dog 的构造函数中,我只是减少 lastId。

但是一旦我将狗保存在数据库中或狗“死”在垃圾收集器中,负 ID 不再用于该对象,因此可以被其他活着但未保存的狗使用。

因为 max Integer = 2,147,483,647,如果我对 Dog's 的大型列表进行大量生成抑制,我可能会超过整数的最大限制......

Private Shared _LastId = 0

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

这里可以使用什么“回收”机制来防止溢出?

4

3 回答 3

1

三个选项

1

使用单独的 TempID,即 Int64。

覆盖 Equals 和 == 以足够聪明地使用 TempID 或 ID。

但不要在对象获得真实 ID 时更改 Hash。

2

或者使用 Int64 作为 ID(临时和真实)。
从好的方面来说,您碰巧只使用 Int32。

3

在 Dog 上实施 Dispose 并在那里返回 -ID。

并在 Dog 获得正 ID 时返回 -ID。

在获得新的 -ID 之前,拥有回收的 -ID 的 HashSet 并从该列表中获取。

于 2012-10-09T13:47:16.353 回答
0

为什么不将所有未保存的新对象保留为默认值 0?或者更好的是,使用像 NHibernate 或实体框架这样的 ORM 来处理这个问题?

于 2012-10-09T13:16:30.610 回答
0

一旦达到可能的最低值,只需重置回 -1 可能会满足您的需求:

Public Sub New()
    If _LastId > Interger.MinValue Then
        Me.Id = _LastId - 1
    Else
        Me.Id = -1
    End if
    ' ...
于 2012-10-09T13:27:24.803 回答