public async Task <IActionResult> AddField(CreateTableFieldViewModel field) { var entitiesList = _entityService.Tables; var table = entitiesList.FirstOrDefault(x => x.Id == field.TableId); var tableName = table?.Name; var schema = table?.EntityType; field.EntitiesList = entitiesList.Select(x => x.Name).ToList(); if (table == null) { ModelState.AddModelError(string.Empty, "Table not found"); return(View(field)); } var baseEntityProps = BaseModel.GetPropsName().Select(x => x.ToLower()).ToList(); if (baseEntityProps.Contains(field.Name.Trim().ToLower())) { ModelState.AddModelError(string.Empty, "This field name can't be used, is system name!"); return(View(field)); } var configurationsRq = await _entityService.RetrieveConfigurationsOnAddNewTableFieldAsyncTask(field); if (configurationsRq.IsSuccess) { field.Configurations = configurationsRq.Result.ToList(); } field = field.CreateSqlField(); var insertField = _tablesService.AddFieldSql(field, tableName, ConnectionString, true, schema); // Save field model in the dataBase if (!insertField.Result) { ModelState.AddModelError(string.Empty, "Fail to apply changes to database!"); return(View(field)); } if (!table.IsCommon) { var isDynamic = true; var isReference = false; var referenceIsCommon = true; var tenants = _organizationService.GetAllTenants().Where(x => x.MachineName != GearSettings.DEFAULT_ENTITY_SCHEMA).ToList(); if (field.Parameter == FieldType.EntityReference) { isReference = true; var referenceTableName = field.Configurations .FirstOrDefault(x => x.Name == nameof(TableFieldConfigCode.Reference.ForeingTable))?.Value; if (!referenceTableName.IsNullOrEmpty()) { var refTable = await Context.Table.FirstOrDefaultAsync(x => x.Name.Equals(referenceTableName) && x.EntityType.Equals(GearSettings.DEFAULT_ENTITY_SCHEMA) || x.Name.Equals(referenceTableName) && x.IsPartOfDbContext); if (refTable.IsPartOfDbContext) { isDynamic = false; } else if (!refTable.IsCommon) { referenceIsCommon = false; } } } foreach (var tenant in tenants) { if (isDynamic && isReference && !referenceIsCommon) { var schemaConf = field.Configurations?.FirstOrDefault(x => x.ConfigCode.Equals(TableFieldConfigCode.Reference.ForeingSchemaTable)); if (schemaConf != null) { var index = field.Configurations.IndexOf(schemaConf); schemaConf.Value = tenant.MachineName; field.Configurations = field.Configurations.Replace(index, schemaConf).ToList(); } } _tablesService.AddFieldSql(field, tableName, ConnectionString, true, tenant.MachineName); } } var configs = field.Configurations.Select(item => new TableFieldConfigValue { TableFieldConfigId = item.ConfigId, Value = item.Value, }).ToList(); var model = new TableModelField { DataType = field.DataType, TableId = field.TableId, Description = field.Description, Name = field.Name, DisplayName = field.DisplayName, AllowNull = field.AllowNull, Synchronized = true, TableFieldTypeId = field.TableFieldTypeId, TableFieldConfigValues = configs }; Context.TableFields.Add(model); var result = await Context.SaveAsync(); if (result.IsSuccess) { RefreshRuntimeTypes(); return(RedirectToAction("Edit", "Table", new { id = field.TableId, tab = "two" })); } ModelState.AppendResultModelErrors(result.Errors); return(View(field)); }