public HardObjectReference GetHardObjectReferenceById(Transaction trans, int id) { if (id <= 0) { return HardObjectReference.Invalid; } ObjectReference @ref = trans.ReferenceForId(id); if (@ref != null) { // Take care about handling the returned candidate reference. // If you loose the reference, weak reference management might also. object candidate = @ref.GetObject(); if (candidate != null) { return new HardObjectReference(@ref, candidate); } trans.RemoveReference(@ref); } @ref = new ObjectReference(id); object readObject = @ref.Read(trans, new LegacyActivationDepth(0), Const4.AddToIdTree , true); if (readObject == null) { return HardObjectReference.Invalid; } // check class creation side effect and simply retry recursively // if it hits: if (readObject != @ref.GetObject()) { return GetHardObjectReferenceById(trans, id); } return new HardObjectReference(@ref, readObject); }