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); }
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; } }
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; } }