/// <summary> /// lookup or store an object in the 'live object cache'. /// Example: /// To store Product with ProductID=1, we use the following IdentityKey: /// IdentityKey{Type=Product, Keys={1}} /// </summary> /// <param name="key"></param> /// <returns></returns> public object this[IdentityKey key] { get { object o; lock (entities) entities.TryGetValue(key, out o); return o; } set { lock (entities) entities[key] = value; } }
/// <summary> /// Registers an entity to be watched /// </summary> /// <param name="entity"></param> /// <param name="identityKey"></param> public void RegisterToWatch(object entity, IdentityKey identityKey) { }
/// <summary> /// Finds entity by key (PK) /// </summary> /// <param name="identityKey"></param> /// <returns></returns> public EntityTrack FindByIdentity(IdentityKey identityKey) { return null; }
/// <summary> /// Finds entity by key (PK) /// </summary> /// <param name="identityKey"></param> /// <returns></returns> public EntityTrack FindByIdentity(IdentityKey identityKey) { EntityTrack entityTrack; entitiesByKey.TryGetValue(identityKey, out entityTrack); return entityTrack; }
/// <summary> /// Registers an entity to be watched /// </summary> /// <param name="entity"></param> /// <param name="identityKey"></param> public void RegisterToWatch(object entity, IdentityKey identityKey) { var entityTrack = FindByReference(entity); if (entityTrack == null) { entityTrack = FindByIdentity(identityKey); if (entityTrack != null) throw new System.Data.Linq.DuplicateKeyException(entity); entityTrack = new EntityTrack(entity, EntityState.ToWatch) { IdentityKey = identityKey }; entities.Add(entityTrack); entitiesByKey[identityKey] = entityTrack; } else { // changes the state of the current entity switch (entityTrack.EntityState) { case EntityState.ToInsert: entityTrack.EntityState = EntityState.ToWatch; entityTrack.IdentityKey = identityKey; entitiesByKey[identityKey] = entityTrack; break; // watched entities should not be registered again case EntityState.ToWatch: case EntityState.ToDelete: throw new InvalidOperationException(); default: throw new ArgumentOutOfRangeException(); } } }
public void Remove(IdentityKey key) { lock (entities) entities.Remove(key); }