public async Task <TResult> ExecuteUpdateAsync <TEntity, TResult>(MemberInfo memberInfo, IAzureStorageTableEntity <TEntity> updatedEntity, IAzureStorageTableEntity <TEntity> existingEntity, AzureTableDriverDynamic repository, Func <Func <Task>, TResult> onSuccessWithRollback, Func <TResult> onFailure) { var newValue = memberInfo.GetValue(updatedEntity.Entity); var existingValue = memberInfo.GetValue(updatedEntity.Entity); if (newValue.GetType().IsAssignableTo(typeof(System.Delegate))) { var dele = (Delegate)newValue; var deleType = dele.Target.GetType(); if (deleType.DeclaringType.GUID == typeof(StorageSubtableAttribute).GUID) { return(onSuccessWithRollback(() => true.AsTask())); } } var rowKeyRef = updatedEntity.RowKey; var partitionKeyRef = updatedEntity.PartitionKey; var memberType = typeof(TEntity); var taskValue = newValue.ExecuteFunction(out Type taskType); var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave); var rawValues = Serialize(resultValue, typeToSave); ITableEntity subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues); var tableName = StorageLookupAttribute.GetMemberTableName(memberInfo); var tableRef = repository.TableClient.GetTableReference(tableName); return(await repository.InsertOrReplaceAsync(subtableEntity, new E5CloudTable(tableRef), (created, tr) => onSuccessWithRollback(() => 1.AsTask()))); }
public async Task <TResult> ExecuteCreateAsync <TEntity, TResult>(MemberInfo memberInfo, string rowKeyRef, string partitionKeyRef, TEntity value, IDictionary <string, EntityProperty> dictionary, AzureTableDriverDynamic repository, Func <Func <Task>, TResult> onSuccessWithRollback, Func <TResult> onFailure) { var memberType = typeof(TEntity); var taskValue = value.ExecuteFunction(out Type taskType); var resultValue = await taskValue.CastAsTaskObjectAsync(out Type typeToSave); var rawValues = Serialize(resultValue, typeToSave); var subtableEntity = new SubtableEntity(rowKeyRef, partitionKeyRef, rawValues); var tableName = StorageLookupAttribute.GetMemberTableName(memberInfo); var tableRef = repository.TableClient.GetTableReference(tableName); return(await repository.CreateAsync(subtableEntity, new E5CloudTable(tableRef), (discard, discard2) => onSuccessWithRollback(() => 1.AsTask()), onAlreadyExists : () => onFailure())); }