0

私はオブジェクトを持っています、犬と言ってください。各犬に対して、DB は一意の識別子 (ID) を生成します。

しかし、Dog を DB に保存する前に、一時的な (負の ID) を生成する必要があります。

そこで、Dog クラスに共有 (静的) _lastId = 0 を作成しました。

Dog のコンストラクターでは、lastId をデクリメントするだけです。

しかし、犬をDBに保存するか、ガベージコレクターで犬が「死ぬ」と、そのオブジェクトには負のIDが使用されなくなるため、生きているが保存されていない他の犬で使用できます。

max Integer =2,147,483,647であるため、Dog の大きなリストの生成抑制を何度も行うと、整数の最大制限を超える可能性があります...

Private Shared _LastId = 0

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

オーバーフローを防ぐために、ここでどのような「リサイクル」メカニズムを使用できますか?

4

3 に答える 3

1

3 つのオプション

1

Int64 である別の TempID を使用します。

Equals と == をオーバーライドして、TempID または ID のいずれかを使用できるようにします。

ただし、オブジェクトが実際の ID を取得したときにハッシュを変更しないでください。

2

または、ID (temp および real) に Int64 を使用します。
良い面としては、たまたま Int32 しか使用していません。

3

Dog に Dispose を実装し、そこに -ID を返します。

そして、Dog が正の ID を取得したら、ID を返します。

リサイクルされた -ID の HashSet を持ち、新しい -ID を取得する前にそのリストから取得します。

于 2012-10-09T13:47:16.353 に答える
0

保存されていないすべての新しいオブジェクトをデフォルト値の 0 に保持しないのはなぜですか? または、NHibernate や Entity フレームワークなどの ORM を使用してこれを処理しますか?

于 2012-10-09T13:16:30.610 に答える