/// <summary> /// Create data bindings for record with its inner structure. /// </summary> /// <param name="bindingStructure"><see cref="SchemaDataBindingStructure"/>.</param> /// <param name="recordId">Primary record identifier.</param> /// <param name="sysPackageUId">Package UId.</param> /// <param name="previousResult">Data binding controller result</param> /// <returns></returns> protected DataBindingControllerResult GenerateHierarchyBinding(SchemaDataBindingStructure bindingStructure, Guid recordId, Guid sysPackageUId, DataBindingControllerResult previousResult = null) { if (previousResult == null) { previousResult = CreateEmptySuccessDataBindingControllerResult(); } if (IsExistInBindedBundleList(bindingStructure)) { return(previousResult); } var entities = GetEntities(bindingStructure, recordId); if (entities.Count == 0) { return(previousResult); } var manufacturerParameters = GetManufacturerParameters(bindingStructure, recordId, sysPackageUId); previousResult = GenerateInnerStructureCollectionBinding(bindingStructure.DependsStructures, recordId, sysPackageUId, previousResult); var bindingResult = Manufacturer.GenerateBinding(entities, manufacturerParameters); previousResult.Success = previousResult.Success && bindingResult.Success; if (bindingResult.ResultMessages?.Any() == true) { AddResultMessages(recordId, bindingResult.ResultMessages, ref previousResult); } if (previousResult.Success) { AddBindedBundleToList(bindingStructure); previousResult = GenerateInnerStructureCollectionBinding(bindingStructure.InnerStructures, recordId, sysPackageUId, previousResult); } return(previousResult); }
private void AddBindedBundleToList(SchemaDataBindingStructure bindingStructure) { if (bindingStructure.IsBundle) { _bindedBundles.Add(bindingStructure.EntitySchemaName); } ; }
/// <summary> /// Generate name for data binding. /// </summary> /// <param name="bindingStructure">Binding structure.</param> /// <param name="recordId">Primary record identifier.</param> /// <returns>Name for binding to be created or updated.</returns> private string GetSchemaDataBindingName(SchemaDataBindingStructure bindingStructure, Guid recordId) { if (bindingStructure.IsBundle) { return($"{_defaultBindingPrefix}_{bindingStructure.EntitySchemaName}"); } var identifier = recordId.ToString().Replace("-", ""); return($"{_defaultBindingPrefix}_{bindingStructure.EntitySchemaName}_{identifier}"); }
/// <summary> /// Bind inner record by structure passed. /// </summary> /// <param name="innerStructure"><see cref="SchemaDataBindingStructure"/>.</param> /// <param name="recordId">Primary record identifier.</param> /// <param name="sysPackageUId">Package UId.</param> /// <param name="previousResult"><see cref="DataBindingControllerResult"/> from parent binding.</param> /// <returns><see cref="DataBindingControllerResult"/> combined parent and inner structure binding result.</returns> protected DataBindingControllerResult GenerateInnerStructureBinding(SchemaDataBindingStructure innerStructure, Guid recordId, Guid sysPackageUId, DataBindingControllerResult previousResult = null) { var innerResult = GenerateHierarchyBinding(innerStructure, recordId, sysPackageUId, previousResult); if (innerResult != null) { previousResult.Success = previousResult.Success && innerResult.Success; AddResultMessages(recordId, innerResult, ref previousResult); } return(previousResult); }
/// <summary> /// Get parameters for <see cref="SchemaDataBindingManufacturer"/>. /// </summary> /// <param name="bindingStructure"><see cref="SchemaDataBindingStructure"/>.</param> /// <param name="recordId">Primary record identifier.</param> /// <param name="sysPackageUId">Package UId.</param> /// <returns></returns> protected DataBindingManufacturerParameters GetManufacturerParameters(SchemaDataBindingStructure bindingStructure, Guid recordId, Guid sysPackageUId) { return(new DataBindingManufacturerParameters { Name = GetSchemaDataBindingName(bindingStructure, recordId), PackageUId = sysPackageUId, EntitySchemaName = bindingStructure.EntitySchemaName, Columns = bindingStructure.Columns.Select(column => new DataBindingManufacturerColumn { Name = column.Name, IsForceUpdate = column.IsForceUpdate, IsKey = column.IsKey }) }); }
/// <summary> /// Get default structure for any entity schema. /// </summary> /// <param name="userConnection">User connection.</param> /// <param name="entitySchemaName">Entity schema name.</param> /// <returns><see cref="SchemaDataBindingStructure"/></returns> public virtual SchemaDataBindingStructure ObtainStructureBySchemaName(UserConnection userConnection, string entitySchemaName) { var entitySchema = userConnection.EntitySchemaManager.GetInstanceByName(entitySchemaName); var structure = new SchemaDataBindingStructure { EntitySchemaName = entitySchemaName, Columns = entitySchema.Columns .Where(column => !column.IsVirtual && !column.IsSystem) .Where(column => !_ignoredColumns.Contains(column.Name)) .Select(column => column.Name == entitySchema.PrimaryColumn.Name ? new SchemaDataBindingStructureColumn(column.Name, false, true) : new SchemaDataBindingStructureColumn(column.Name)) .ToList(), FilterColumnPathes = new string[] { "Id" } }; return(structure); }
/// <summary> /// Build <see cref="EntitySchemaQuery"/> for record binding. /// </summary> /// <param name="bindingStructure"><see cref="SchemaDataBindingStructure"/>.</param> /// <param name="recordId">Primary record identifier.</param> /// <returns><see cref="EntitySchemaQuery"/>.</returns> protected EntitySchemaQuery GenerateEsq(SchemaDataBindingStructure bindingStructure, Guid recordId) { var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, bindingStructure.EntitySchemaName); esq.PrimaryQueryColumn.IsAlwaysSelect = true; foreach (var column in bindingStructure.Columns) { esq.AddColumn(column.Name); } if (!bindingStructure.IsBundle) { foreach (string columnPath in bindingStructure.FilterColumnPathes) { esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, columnPath, recordId)); } esq.Filters.LogicalOperation = LogicalOperationStrict.Or; } return(esq); }
/// <summary> /// Create bindings for all records passed. /// </summary> /// <param name="bindingStructure"><see cref="SchemaDataBindingStructure"/>.</param> /// <param name="recordIds">Primary record identifiers list.</param> /// <param name="sysPackageUId">Package UId.</param> protected DataBindingControllerResult GenerateHierarchyBindings(SchemaDataBindingStructure bindingStructure, Guid[] recordIds, Guid sysPackageUId) { var bindingResult = CreateEmptySuccessDataBindingControllerResult(); foreach (var recordId in recordIds) { using (var dbExecutor = UserConnection.EnsureDBConnection()) { DataBindingControllerResult result = null; dbExecutor.StartTransaction(); try { result = GenerateHierarchyBinding(bindingStructure, recordId, sysPackageUId); } catch (Exception e) { dbExecutor.RollbackTransaction(); ClearBindedBundlesList(); bindingResult.Success = false; AddExceptionToResultMessages(recordId, e, ref bindingResult); } if (result == null) { continue; } if (result.Success) { dbExecutor.CommitTransaction(); } else { dbExecutor.RollbackTransaction(); ClearBindedBundlesList(); } bindingResult.Success = bindingResult.Success && result.Success; AddResultMessages(recordId, result, ref bindingResult); } } ClearBindedBundlesList(); return(bindingResult); }
protected EntityCollection GetEntities(SchemaDataBindingStructure bindingStructure, Guid recordId) { var esq = GenerateEsq(bindingStructure, recordId); return(esq.GetEntityCollection(UserConnection)); }
private bool IsExistInBindedBundleList(SchemaDataBindingStructure bindingStructure) { return(bindingStructure.IsBundle && _bindedBundles.Contains(bindingStructure.EntitySchemaName)); }