public override TEntity Remove(TEntity entity) { var id = EntityOperation.GetSurrogateKey(entity); if (EntityOperation <TEntity> .IsValidSurrogateKey(id)) { var change = default(Change); if (Changes.TryGetValue(id, out change)) { if (change.Entity != entity) { ThrowAttachingMoreThanOneEntityException(); } change.ChangeType = ChangeType.Remove; } else { var nonkeyValues = EntityOperation.NonkeyValues(entity); change = new Change(entity, id, nonkeyValues, ChangeType.Remove); Changes.Add(id, change); } } else { AddedEntities.Remove(entity); } return(entity); }
public IEntity CreateEntity(string prettyName = "") { ContentEntity added = new ContentEntity(EntityIdGenerator.Next(), prettyName); AddedEntities.Add(added); return(added); }
public override int SaveChanges() { var count = 0; var relation = Table.Relation; var addedEntities = AddedEntities.ToArray(); var changes = Changes.Values.ToArray(); AddedEntities.Clear(); Changes.Clear(); Local.Clear(); foreach (var entity in addedEntities) { AddToRelation(entity); count++; } foreach (var change in changes) { switch (change.ChangeType) { case ChangeType.Add: AddToRelation(change.Entity); count++; break; case ChangeType.Remove: if (!relation.Remove(change.Id)) { ThrowRemovingNonexistingKeyException(); } count++; break; case ChangeType.Update: var values = EntityOperation.NonkeyValues(change.Entity); if (!values.SequenceEqual(change.Original)) { // Throws if the key not found. relation[change.Id] = change.Entity; count++; } break; default: throw new Exception("changeType = " + change.ChangeType); } } return(count); }
/// <summary> /// Helper for tests to create snapshots with entities within more collections than just /// AddedEntities. /// </summary> internal IEntity CreateEntity(EntityAddTarget target, string prettyName = "") { ContentEntity added = new ContentEntity(EntityIdGenerator.Next(), prettyName); if (target == EntityAddTarget.Added) { AddedEntities.Add(added); } else if (target == EntityAddTarget.Active) { ActiveEntities.Add(added); } else { RemovedEntities.Add(added); } return(added); }
IEnumerable <TEntity> Enumerate() { foreach (var entity in AddedEntities.ToArray()) { yield return(entity); } var ids = Changes.Values.Select(ch => ch.Id) .Concat(Table.Relation.Keys) .ToArray() .Distinct(); foreach (var id in ids) { var entity = Find(id); if (entity != null) { yield return(entity); } } }
public GameSnapshotEntityRemoveResult RemoveEntity(IEntity entity) { if (GlobalEntity == entity) { return(GameSnapshotEntityRemoveResult.Failed); } for (int i = 0; i < AddedEntities.Count; ++i) { if (entity.UniqueId == AddedEntities[i].UniqueId) { AddedEntities.RemoveAt(i); return(GameSnapshotEntityRemoveResult.Destroyed); } } for (int i = 0; i < ActiveEntities.Count; ++i) { if (entity.UniqueId == ActiveEntities[i].UniqueId) { IEntity removed = ActiveEntities[i]; ActiveEntities.RemoveAt(i); RemovedEntities.Add(removed); return(GameSnapshotEntityRemoveResult.IntoRemoved); } } foreach (IEntity removed in RemovedEntities) { if (entity.UniqueId == removed.UniqueId) { return(GameSnapshotEntityRemoveResult.Failed); } } throw new InvalidOperationException("Unable to find entity with UniqueId = " + entity.UniqueId); }
public override T Add(T entity) { AddedEntities.Add(entity); _contentCollection.Add(entity); return(entity); }