/// <summary> /// Store an object with the specific id /// </summary> /// <param name="oid"> </param> /// <param name="plainObject"> </param> private OID InternalStore <T>(OID oid, T plainObject) where T : class { if (GetSession().IsRollbacked()) { throw new OdbRuntimeException( NDatabaseError.OdbHasBeenRollbacked.AddParameter(GetBaseIdentification().ToString())); } if (plainObject == null) { throw new OdbRuntimeException(NDatabaseError.OdbCanNotStoreNullObject); } var type = typeof(T); if (OdbType.IsNative(type)) { throw new OdbRuntimeException( NDatabaseError.OdbCanNotStoreNativeObjectDirectly.AddParameter(type.FullName).AddParameter( OdbType.GetFromClass(type).Name).AddParameter(type.FullName)); } // first detects if we must perform an insert or an update // If object is in the cache, we must perform an update, else an insert var cache = GetSession().GetCache(); var cacheOid = cache.IdOfInsertingObject(plainObject); if (cacheOid != null) { return(cacheOid); } // throw new ODBRuntimeException("Inserting meta representation of // an object without the object itself is not yet supported"); var mustUpdate = cache.Contains(plainObject); // The introspection callback is used to execute some specific task (like calling trigger, for example) while introspecting the object var callback = _introspectionCallbackForInsert; if (mustUpdate) { callback = _introspectionCallbackForUpdate; } // Transform the object into an ObjectInfo var nnoi = (NonNativeObjectInfo) _objectIntrospector.GetMetaRepresentation(plainObject, true, null, callback); // During the introspection process, if object is to be updated, then the oid has been set mustUpdate = nnoi.GetOid() != null; return(mustUpdate ? _objectWriter.UpdateNonNativeObjectInfo(nnoi, false) : _objectWriter.InsertNonNativeObject(oid, nnoi, true)); }