Пример #1
0
        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);
        }
Пример #2
0
        public IEntity CreateEntity(string prettyName = "")
        {
            ContentEntity added = new ContentEntity(EntityIdGenerator.Next(), prettyName);

            AddedEntities.Add(added);
            return(added);
        }
Пример #3
0
        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);
        }
Пример #4
0
        /// <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);
        }
Пример #5
0
        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);
                }
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
 public override T Add(T entity)
 {
     AddedEntities.Add(entity);
     _contentCollection.Add(entity);
     return(entity);
 }