Ejemplo n.º 1
0
        public void Delete <T>(T entity)
        {
            if (EntityMetadataMap.ContainsKey(entity) == false)
            {
                throw new InvalidOperationException(String.Format("{0} is not associated with the current couch document session, cannot delete unknown entity.", entity));
            }

            DeletedEntities.Add(entity);
        }
Ejemplo n.º 2
0
        public void SaveChanges()
        {
            var docs     = new List <CouchDocument>();
            var entities = new List <object>();

            foreach (var entity in DeletedEntities)
            {
                EntityMetadata entityMetadata;
                if (EntityMetadataMap.TryGetValue(entity, out entityMetadata))
                {
                    EntityMetadataMap.Remove(entity);
                    IdentityMap.Remove(entityMetadata.Key);

                    Type         entityType       = entity.GetType();
                    PropertyInfo identityProperty = CouchDatabase.CouchDocumentConvention.GetIdentityPropertyFor(entityType);

                    docs.Add(CouchDocument.Dehydrate(entity, identityProperty, entityMetadata.Revision, true));
                    entities.Add(entity);
                }
            }
            DeletedEntities.Clear();

            foreach (var entity in EntityMetadataMap.Where(pair => IsEntityDirty(pair.Key, pair.Value)))
            {
                Type         entityType       = entity.Key.GetType();
                PropertyInfo identityProperty = CouchDatabase.CouchDocumentConvention.GetIdentityPropertyFor(entityType);
                docs.Add(CouchDocument.Dehydrate(entity.Key, identityProperty, entity.Value.Revision, false));
                entities.Add(entity.Key);
            }

            if (docs.Count == 0 && entities.Count == 0)
            {
                return;
            }

            var bulkDocsMessage = new BulkDocsMessage(docs);
            var bulkDocsCommand = new BulkDocsCommand(CouchDatabase.Name, bulkDocsMessage);

            BulkDocsResult[] results = CouchDatabase.CouchProxy.Execute <BulkDocsResult[]>(bulkDocsCommand);

            for (int index = 0; index < results.Length; index++)
            {
                BulkDocsResult result = results[index];
                object         entity = entities[index];

                EntityMetadata entityMetadata;
                if (EntityMetadataMap.TryGetValue(entity, out entityMetadata) == false)
                {
                    continue;
                }

                IdentityMap[result.Id]        = entity;
                entityMetadata.Revision       = result.Rev;
                entityMetadata.OriginalEntity = entity;
            }
        }
Ejemplo n.º 3
0
        public void Store(object entity)
        {
            Type         entityType       = entity.GetType();
            PropertyInfo identityProperty = CouchDatabase.CouchDocumentConvention.GetIdentityPropertyFor(entityType);

            object id = null;

            if (identityProperty != null)
            {
                id = GetIdentityValueFor(entity, identityProperty);

                if (id == null)
                {
                    id = CouchDatabase.CouchDocumentConvention.GenerateIdentityFor(identityProperty.PropertyType);
                    identityProperty.SetValue(entity, id, null);
                }
            }

            if (id != null)
            {
                if (IdentityMap.ContainsKey(id.ToString()))
                {
                    if (ReferenceEquals(IdentityMap[id.ToString()], entity))
                    {
                        return;
                    }

                    throw new NonUniqueEntityException("Attempted to associate a different entity with id '" + id + "'.");
                }

                var entityMetadata = new EntityMetadata {
                    Key = id.ToString(), Revision = String.Empty
                };
                EntityMetadataMap.Add(entity, entityMetadata);
                IdentityMap[id.ToString()] = entity;
            }
        }