private async Task <List <TableOperation> > BuildTableOperationUpsert(T entity) { var entityId = EntityDefinition.GetIdValues(entity); var serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity)); var fields = GetEntityFilterableFields(entity).ToList(); var record = GenerateRecordMainPartition(entity, serializedField, fields); List <TableOperation> operations = new List <TableOperation> { TableOperation.InsertOrReplace(record) }; operations.AddRange(GeneratePersistPartitionData(entity, serializedField, fields) .Select(TableOperation.InsertOrReplace)); var idValue = string.Join(StorageQueryBuilder.PARTITION_FIELD_SEPARATOR, entityId.Select(StorageQueryBuilder.NormalizeStringValue)); var old = await GetById(StorageQueryBuilder.GetTableKeyNormalizedValue(idValue)).ConfigureAwait(false); if (old != null) { var oldFields = GetEntityFilterableFields(old); IEnumerable <TableOperation> deleteOperations = GeneratePersistPartitionData(old, null, oldFields) .Select(TableOperation.Delete) .Where(d => !operations.Any(o => o.Entity.PartitionKey == d.Entity.PartitionKey && o.Entity.RowKey == d.Entity.RowKey)) .ToList(); operations.AddRange(deleteOperations); } return(operations); }
private async Task <List <TableOperation> > BuildTableOperationUpdate(T entity) { var entityIdValues = EntityDefinition.GetIdValues(entity); var idString = string.Join(StorageQueryBuilder.PARTITION_FIELD_SEPARATOR, entityIdValues.Select(StorageQueryBuilder.NormalizeStringValue)); var serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity)); var fields = GetEntityFilterableFields(entity); var record = GenerateRecordMainPartition(entity, serializedField, fields); List <TableOperation> operations = new List <TableOperation> { TableOperation.Replace(record) }; var old = await GetById(idString).ConfigureAwait(false); if (old != null) { var oldFields = GetEntityFilterableFields(old); operations.AddRange(GeneratePersistPartitionData(old, null, oldFields).Select(TableOperation.Delete)); } return(operations); }
private byte[] ComputeDefinitionHash() { var bsonDefinition = BSonConvert.SerializeObject(EntityDefinition); using (var sha1Hash = SHA1.Create()) { byte[] data = sha1Hash.ComputeHash(bsonDefinition); return(data); } }
private List <TableOperation> BuildTableOperationInsert(T entity) { List <KeyValuePair <string, EntityProperty> > fields = GetEntityFilterableFields(entity).ToList(); EntityProperty serializedField = EntityProperty.GeneratePropertyForByteArray(BSonConvert.SerializeObject(entity)); var record = GenerateRecordMainPartition(entity, serializedField, fields); List <TableOperation> operations = new List <TableOperation> { TableOperation.Insert(record) }; foreach (var partitionRecord in GeneratePersistPartitionData(entity, serializedField, fields)) { operations.Add(TableOperation.Insert(partitionRecord)); } return(operations); }