本文整理汇总了C#中NHibernate.Engine.EntityKey类的典型用法代码示例。如果您正苦于以下问题:C# EntityKey类的具体用法?C# EntityKey怎么用?C# EntityKey使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
EntityKey类属于NHibernate.Engine命名空间,在下文中一共展示了EntityKey类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: Reassociate
/// <summary>
/// Associates a given entity (either transient or associated with another session) to the given session.
/// </summary>
/// <param name="event">The event triggering the re-association </param>
/// <param name="entity">The entity to be associated </param>
/// <param name="id">The id of the entity. </param>
/// <param name="persister">The entity's persister instance. </param>
/// <returns> An EntityEntry representing the entity within this session. </returns>
protected EntityEntry Reassociate(AbstractEvent @event, object entity, object id, IEntityPersister persister)
{
if (log.IsDebugEnabled)
{
log.Debug("Reassociating transient instance: " +
MessageHelper.InfoString(persister, id, @event.Session.Factory));
}
IEventSource source = @event.Session;
EntityKey key = new EntityKey(id, persister, source.EntityMode);
source.PersistenceContext.CheckUniqueness(key, entity);
//get a snapshot
object[] values = persister.GetPropertyValues(entity, source.EntityMode);
TypeFactory.DeepCopy(values, persister.PropertyTypes, persister.PropertyUpdateability, values, source);
object version = Versioning.GetVersion(values, persister);
EntityEntry newEntry = source.PersistenceContext.AddEntity(entity, Status.Loaded, values, key, version, LockMode.None, true, persister, false, true);
new OnLockVisitor(source, id, entity).Process(entity, persister);
persister.AfterReassociate(entity, source);
return newEntry;
}
示例2: AddBatchLoadableEntityKey
/// <summary>
/// If an EntityKey represents a batch loadable entity, add
/// it to the queue.
/// </summary>
/// <remarks>
/// Note that the contract here is such that any key passed in should
/// previously have been been checked for existence within the
/// <see cref="ISession" />; failure to do so may cause the
/// referenced entity to be included in a batch even though it is
/// already associated with the <see cref="ISession" />.
/// </remarks>
public void AddBatchLoadableEntityKey(EntityKey key)
{
if (key.IsBatchLoadable)
{
batchLoadableEntityKeys[key] = Marker;
}
}
示例3: EntityIdentityInsertAction
public EntityIdentityInsertAction(object[] state, object instance, IEntityPersister persister, ISessionImplementor session, bool isDelayed)
: base(session, null, instance, persister)
{
this.state = state;
this.isDelayed = isDelayed;
delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : null;
}
开发者ID:khaliyo,项目名称:Spring.net-NHibernate.net-Asp.net-MVC-DWZ-,代码行数:7,代码来源:EntityIdentityInsertAction.cs
示例4: ProcessDereferencedCollection
private static void ProcessDereferencedCollection(IPersistentCollection coll, ISessionImplementor session)
{
IPersistenceContext persistenceContext = session.PersistenceContext;
CollectionEntry entry = persistenceContext.GetCollectionEntry(coll);
ICollectionPersister loadedPersister = entry.LoadedPersister;
if (log.IsDebugEnabled && loadedPersister != null)
log.Debug("Collection dereferenced: " + MessageHelper.InfoString(loadedPersister, entry.LoadedKey, session.Factory));
// do a check
bool hasOrphanDelete = loadedPersister != null && loadedPersister.HasOrphanDelete;
if (hasOrphanDelete)
{
object ownerId = loadedPersister.OwnerEntityPersister.GetIdentifier(coll.Owner, session.EntityMode);
// TODO NH Different behavior
//if (ownerId == null)
//{
// // the owning entity may have been deleted and its identifier unset due to
// // identifier-rollback; in which case, try to look up its identifier from
// // the persistence context
// if (session.Factory.Settings.IsIdentifierRollbackEnabled)
// {
// EntityEntry ownerEntry = persistenceContext.GetEntry(coll.Owner);
// if (ownerEntry != null)
// {
// ownerId = ownerEntry.Id;
// }
// }
// if (ownerId == null)
// {
// throw new AssertionFailure("Unable to determine collection owner identifier for orphan-delete processing");
// }
//}
EntityKey key = new EntityKey(ownerId, loadedPersister.OwnerEntityPersister, session.EntityMode);
object owner = persistenceContext.GetEntity(key);
if (owner == null)
{
throw new AssertionFailure("collection owner not associated with session: " + loadedPersister.Role);
}
EntityEntry e = persistenceContext.GetEntry(owner);
//only collections belonging to deleted entities are allowed to be dereferenced in the case of orphan delete
if (e != null && e.Status != Status.Deleted && e.Status != Status.Gone)
{
throw new HibernateException("A collection with cascade=\"all-delete-orphan\" was no longer referenced by the owning entity instance: " + loadedPersister.Role);
}
}
// do the work
entry.CurrentPersister = null;
entry.CurrentKey = null;
PrepareCollectionForUpdate(coll, entry, session.EntityMode, session.Factory);
}
示例5: DoEvict
protected virtual void DoEvict(object obj, EntityKey key, IEntityPersister persister, IEventSource session)
{
if (log.IsDebugEnabled)
{
log.Debug("evicting " + MessageHelper.InfoString(persister));
}
// remove all collections for the entity from the session-level cache
if (persister.HasCollections)
{
new EvictVisitor(session).Process(obj, persister);
}
new Cascade(CascadingAction.Evict, CascadePoint.AfterEvict, session).CascadeOn(persister, obj);
}
示例6: IsNull
public override bool IsNull(object owner, ISessionImplementor session)
{
if (propertyName != null)
{
IEntityPersister ownerPersister = session.Factory.GetEntityPersister(entityName);
object id = session.GetContextEntityIdentifier(owner);
EntityKey entityKey = new EntityKey(id, ownerPersister, session.EntityMode);
return session.PersistenceContext.IsPropertyNull(entityKey, PropertyName);
}
else
{
return false;
}
}
示例7: OnEvict
public virtual void OnEvict(EvictEvent @event)
{
IEventSource source = @event.Session;
object obj = @event.Entity;
IPersistenceContext persistenceContext = source.PersistenceContext;
if (obj is INHibernateProxy)
{
ILazyInitializer li = ((INHibernateProxy)obj).HibernateLazyInitializer;
object id = li.Identifier;
IEntityPersister persister = source.Factory.GetEntityPersister(li.EntityName);
if (id == null)
{
throw new ArgumentException("null identifier");
}
EntityKey key = new EntityKey(id, persister, source.EntityMode);
persistenceContext.RemoveProxy(key);
if (!li.IsUninitialized)
{
object entity = persistenceContext.RemoveEntity(key);
if (entity != null)
{
EntityEntry e = @event.Session.PersistenceContext.RemoveEntry(entity);
DoEvict(entity, key, e.Persister, @event.Session);
}
}
li.Session = null;
}
else
{
EntityEntry e = persistenceContext.RemoveEntry(obj);
if (e != null)
{
EntityKey key = new EntityKey(e.Id, e.Persister, source.EntityMode);
persistenceContext.RemoveEntity(key);
DoEvict(obj, key, e.Persister, source);
}
}
}
示例8: LoadFromResultSet
/// <summary>
/// Hydrate the state of an object from the SQL <c>IDataReader</c>, into
/// an array of "hydrated" values (do not resolve associations yet),
/// and pass the hydrated state to the session.
/// </summary>
private void LoadFromResultSet(IDataReader rs, int i, object obj, string instanceClass, EntityKey key,
string rowIdAlias, LockMode lockMode, ILoadable rootPersister,
ISessionImplementor session)
{
object id = key.Identifier;
// Get the persister for the _subclass_
ILoadable persister = (ILoadable) Factory.GetEntityPersister(instanceClass);
if (log.IsDebugEnabled)
{
log.Debug("Initializing object from DataReader: " + MessageHelper.InfoString(persister, id));
}
bool eagerPropertyFetch = IsEagerPropertyFetchEnabled(i);
// add temp entry so that the next step is circular-reference
// safe - only needed because some types don't take proper
// advantage of two-phase-load (esp. components)
TwoPhaseLoad.AddUninitializedEntity(key, obj, persister, lockMode, !eagerPropertyFetch, session);
// This is not very nice (and quite slow):
string[][] cols = persister == rootPersister
? EntityAliases[i].SuffixedPropertyAliases
: EntityAliases[i].GetSuffixedPropertyAliases(persister);
object[] values = persister.Hydrate(rs, id, obj, rootPersister, cols, eagerPropertyFetch, session);
object rowId = persister.HasRowId ? rs[rowIdAlias] : null;
IAssociationType[] ownerAssociationTypes = OwnerAssociationTypes;
if (ownerAssociationTypes != null && ownerAssociationTypes[i] != null)
{
string ukName = ownerAssociationTypes[i].RHSUniqueKeyPropertyName;
if (ukName != null)
{
int index = ((IUniqueKeyLoadable) persister).GetPropertyIndex(ukName);
IType type = persister.PropertyTypes[index];
// polymorphism not really handled completely correctly,
// perhaps...well, actually its ok, assuming that the
// entity name used in the lookup is the same as the
// the one used here, which it will be
EntityUniqueKey euk =
new EntityUniqueKey(rootPersister.EntityName, ukName, type.SemiResolve(values[index], session, obj), type,
session.EntityMode, session.Factory);
session.PersistenceContext.AddEntity(euk, obj);
}
}
TwoPhaseLoad.PostHydrate(persister, id, values, rowId, obj, lockMode, !eagerPropertyFetch, session);
}
示例9: InstanceAlreadyLoaded
/// <summary>
/// The entity instance is already in the session cache
/// </summary>
private void InstanceAlreadyLoaded(IDataReader rs, int i, IEntityPersister persister, EntityKey key, object obj,
LockMode lockMode, ISessionImplementor session)
{
if (!persister.IsInstance(obj, session.EntityMode))
{
string errorMsg = string.Format("loading object was of wrong class [{0}]", obj.GetType().FullName);
throw new WrongClassException(errorMsg, key.Identifier, persister.EntityName);
}
if (LockMode.None != lockMode && UpgradeLocks())
{
EntityEntry entry = session.PersistenceContext.GetEntry(obj);
bool isVersionCheckNeeded = persister.IsVersioned && entry.LockMode.LessThan(lockMode);
// we don't need to worry about existing version being uninitialized
// because this block isn't called by a re-entrant load (re-entrant
// load _always_ have lock mode NONE
if (isVersionCheckNeeded)
{
// we only check the version when _upgrading_ lock modes
CheckVersion(i, persister, key.Identifier, obj, rs, session);
// we need to upgrade the lock mode to the mode requested
entry.LockMode = lockMode;
}
}
}
示例10: RegisterNonExists
/// <summary>
/// For missing objects associated by one-to-one with another object in the
/// result set, register the fact that the the object is missing with the
/// session.
/// </summary>
private void RegisterNonExists(EntityKey[] keys, ISessionImplementor session)
{
int[] owners = Owners;
if (owners != null)
{
EntityType[] ownerAssociationTypes = OwnerAssociationTypes;
for (int i = 0; i < keys.Length; i++)
{
int owner = owners[i];
if (owner > -1)
{
EntityKey ownerKey = keys[owner];
if (keys[i] == null && ownerKey != null)
{
bool isOneToOneAssociation = ownerAssociationTypes != null && ownerAssociationTypes[i] != null
&& ownerAssociationTypes[i].IsOneToOne;
if (isOneToOneAssociation)
{
session.PersistenceContext.AddNullProperty(ownerKey, ownerAssociationTypes[i].PropertyName);
}
}
}
}
}
}
示例11: GetRowFromResultSet
internal object GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session,
QueryParameters queryParameters, LockMode[] lockModeArray,
EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys,
bool returnProxies)
{
ILoadable[] persisters = EntityPersisters;
int entitySpan = persisters.Length;
for (int i = 0; i < entitySpan; i++)
{
keys[i] =
GetKeyFromResultSet(i, persisters[i], i == entitySpan - 1 ? queryParameters.OptionalId : null, resultSet, session);
//TODO: the i==entitySpan-1 bit depends upon subclass implementation (very bad)
}
RegisterNonExists(keys, session);
// this call is side-effecty
object[] row =
GetRow(resultSet, persisters, keys, queryParameters.OptionalObject, optionalObjectKey, lockModeArray,
hydratedObjects, session);
ReadCollectionElements(row, resultSet, session);
if (returnProxies)
{
// now get an existing proxy for each row element (if there is one)
for (int i = 0; i < entitySpan; i++)
{
object entity = row[i];
object proxy = session.PersistenceContext.ProxyFor(persisters[i], keys[i], entity);
if (entity != proxy)
{
// Force the proxy to resolve itself
((INHibernateProxy) proxy).HibernateLazyInitializer.SetImplementation(entity);
row[i] = proxy;
}
}
}
return GetResultColumnOrRow(row, queryParameters.ResultTransformer, resultSet, session);
}
示例12: GetImplementation
/// <summary>
/// Return the Underlying Persistent Object in a given <see cref="ISession"/>, or null.
/// </summary>
/// <param name="s">The Session to get the object from.</param>
/// <returns>The Persistent Object this proxy is Proxying, or <see langword="null" />.</returns>
public object GetImplementation(ISessionImplementor s)
{
EntityKey key = new EntityKey(Identifier, s.Factory.GetEntityPersister(PersistentClass));
return s.GetEntity(key);
}
示例13: PerformSaveOrReplicate
/// <summary>
/// Performs all the actual work needed to save an entity (well to get the save moved to
/// the execution queue).
/// </summary>
/// <param name="entity">The entity to be saved </param>
/// <param name="key">The id to be used for saving the entity (or null, in the case of identity columns) </param>
/// <param name="persister">The entity's persister instance. </param>
/// <param name="useIdentityColumn">Should an identity column be used for id generation? </param>
/// <param name="anything">Generally cascade-specific information. </param>
/// <param name="source">The session which is the source of the current event. </param>
/// <param name="requiresImmediateIdAccess">
/// Is access to the identifier required immediately
/// after the completion of the save? persist(), for example, does not require this...
/// </param>
/// <returns>
/// The id used to save the entity; may be null depending on the
/// type of id generator used and the requiresImmediateIdAccess value
/// </returns>
protected virtual object PerformSaveOrReplicate(object entity, EntityKey key, IEntityPersister persister, bool useIdentityColumn, object anything, IEventSource source, bool requiresImmediateIdAccess)
{
Validate(entity, persister, source);
object id = key == null ? null : key.Identifier;
// NH Different behavior (shouldDelayIdentityInserts=false anyway)
//bool inTxn = source.ConnectionManager.IsInActiveTransaction;
//bool shouldDelayIdentityInserts = !inTxn && !requiresImmediateIdAccess;
bool shouldDelayIdentityInserts = false;
// Put a placeholder in entries, so we don't recurse back and try to save() the
// same object again. QUESTION: should this be done before onSave() is called?
// likewise, should it be done before onUpdate()?
source.PersistenceContext.AddEntry(entity, Status.Saving, null, null, id, null, LockMode.Write, useIdentityColumn, persister, false, false);
CascadeBeforeSave(source, persister, entity, anything);
// NH-962: This was originally done before many-to-one cascades.
if (useIdentityColumn && !shouldDelayIdentityInserts)
{
log.Debug("executing insertions");
source.ActionQueue.ExecuteInserts();
}
object[] values = persister.GetPropertyValuesToInsert(entity, GetMergeMap(anything), source);
IType[] types = persister.PropertyTypes;
bool substitute = SubstituteValuesIfNecessary(entity, id, values, persister, source);
if (persister.HasCollections)
{
substitute = substitute || VisitCollectionsBeforeSave(entity, id, values, types, source);
}
if (substitute)
{
persister.SetPropertyValues(entity, values, source.EntityMode);
}
TypeHelper.DeepCopy(values, types, persister.PropertyUpdateability, values, source);
new ForeignKeys.Nullifier(entity, false, useIdentityColumn, source).NullifyTransientReferences(values, types);
new Nullability(source).CheckNullability(values, persister, false);
if (useIdentityColumn)
{
EntityIdentityInsertAction insert = new EntityIdentityInsertAction(values, entity, persister, source, shouldDelayIdentityInserts);
if (!shouldDelayIdentityInserts)
{
log.Debug("executing identity-insert immediately");
source.ActionQueue.Execute(insert);
id = insert.GeneratedId;
//now done in EntityIdentityInsertAction
//persister.setIdentifier( entity, id, source.getEntityMode() );
key = source.GenerateEntityKey(id, persister);
source.PersistenceContext.CheckUniqueness(key, entity);
//source.getBatcher().executeBatch(); //found another way to ensure that all batched joined inserts have been executed
}
else
{
log.Debug("delaying identity-insert due to no transaction in progress");
source.ActionQueue.AddAction(insert);
key = insert.DelayedEntityKey;
}
}
object version = Versioning.GetVersion(values, persister);
source.PersistenceContext.AddEntity(
entity,
persister.IsMutable ? Status.Loaded : Status.ReadOnly,
values, key,
version,
LockMode.Write,
useIdentityColumn,
persister,
VersionIncrementDisabled,
false);
//source.getPersistenceContext().removeNonExist( new EntityKey( id, persister, source.getEntityMode() ) );
if (!useIdentityColumn)
{
//.........这里部分代码省略.........
示例14: AddEntity
/// <summary> Add a canonical mapping from entity key to entity instance</summary>
public void AddEntity(EntityKey key, object entity)
{
entitiesByKey[key] = entity;
BatchFetchQueue.RemoveBatchLoadableEntityKey(key);
}
示例15: GetCachedDatabaseSnapshot
/// <summary>
/// Retrieve the cached database snapshot for the requested entity key.
/// </summary>
/// <param name="key">The entity key for which to retrieve the cached snapshot </param>
/// <returns> The cached snapshot </returns>
/// <remarks>
/// <list type="bullet">
/// <listheader><description>This differs from <see cref="GetDatabaseSnapshot"/> is two important respects:</description></listheader>
/// <item><description>no snapshot is obtained from the database if not already cached</description></item>
/// <item><description>an entry of NO_ROW here is interpreted as an exception</description></item>
/// </list>
/// </remarks>
public object[] GetCachedDatabaseSnapshot(EntityKey key)
{
object snapshot;
if (!entitySnapshotsByKey.TryGetValue(key, out snapshot))
return null;
if (snapshot == NoRow)
{
throw new HibernateException("persistence context reported no row snapshot for " + MessageHelper.InfoString(key.EntityName, key.Identifier));
}
return (object[])snapshot;
}