/// <summary> /// Sync entities /// </summary> /// <param name="tableModel"></param> /// <param name="tenantId"></param> /// <param name="schema"></param> public async Task SynchronizeEntities(SynchronizeTableViewModel tableModel, Guid?tenantId, string schema = null) { var table = new TableModel { Name = tableModel.Name, EntityType = schema ?? tableModel.Schema, Description = tableModel.Description, IsSystem = tableModel.IsSystem, IsPartOfDbContext = tableModel.IsStaticFromEntityFramework, TenantId = tenantId }; _context.Table.Add(table); var dbResult = await _context.SaveAsync(); if (dbResult.IsSuccess) { if (!table.IsPartOfDbContext) { var response = _tablesService.CreateSqlTable(table, _connectionString); if (!response.Result) { return; } } await SyncEntityFieldsAsync(tableModel, table); } }
/// <summary> /// Sync table from entity framework /// </summary> /// <param name="tableModel"></param> /// <param name="tableId"></param> /// <returns></returns> public async Task SyncEntityFromEntityFramework(SynchronizeTableViewModel tableModel, Guid tableId) { var fieldTypeList = await _context.TableFieldTypes.ToListAsync(); var fieldConfigList = await _context.TableFieldConfigs.ToListAsync(); foreach (var item in tableModel.Fields) { if (item.Configurations != null) { foreach (var configViewModel in item.Configurations) { configViewModel.Name = fieldConfigList.FirstOrDefault(x => x.Code == configViewModel.ConfigCode)?.Name; } } // Save field model in the dataBase var configValues = new List <TableFieldConfigValue>(); var fieldType = fieldTypeList.FirstOrDefault(x => x.Code == item.TableFieldCode); if (fieldType == null) { continue; } var model = new TableModelField { DataType = item.DataType, DisplayName = item.DisplayName, TableId = tableId, Description = item.Description, Name = item.Name, AllowNull = item.AllowNull, Synchronized = true, TableFieldTypeId = fieldType.Id, }; if (item.Configurations != null) { foreach (var configItem in item.Configurations) { var config = fieldConfigList.FirstOrDefault(x => x.Code == configItem.ConfigCode); if (config == null) { continue; } configValues.Add(new TableFieldConfigValue { TableFieldConfigId = config.Id, TableModelFieldId = model.Id, Value = configItem.Value, }); } } model.TableFieldConfigValues = configValues; _context.TableFields.Add(model); await _context.SaveAsync(); } }
/// <inheritdoc /> /// <summary> /// Get table configuration /// </summary> /// <param name="tableId"></param> /// <param name="tableModel"></param> /// <returns></returns> public async Task <ResultModel <SynchronizeTableViewModel> > GetTableConfiguration(Guid tableId, TableModel tableModel = null) { var result = new ResultModel <SynchronizeTableViewModel>(); var table = tableModel ?? await _context.Table .Include(x => x.TableFields) .ThenInclude(x => x.TableFieldType) .Include(x => x.TableFields) .ThenInclude(x => x.TableFieldConfigValues) .ThenInclude(x => x.TableFieldConfig) .Include(x => x.TableFields) .ThenInclude(x => x.TableFieldType) .AsNoTracking() .FirstOrDefaultAsync(x => x.Id.Equals(tableId)); if (table == null) { result.Errors.Add(new ErrorModel("", "Table not found")); return(result); } var fields = await GetTableFieldsForBuildMode(table); var model = new SynchronizeTableViewModel { Name = table.Name, Description = table.Description, IsStaticFromEntityFramework = table.IsPartOfDbContext, IsSystem = table.IsSystem, Schema = table.EntityType, Fields = fields.ToList() }; result.IsSuccess = true; result.Result = model; return(result); }
/// <summary> /// Complete sync entity /// </summary> /// <param name="tableModel"></param> /// <param name="table"></param> private async Task SyncEntityFieldsAsync(SynchronizeTableViewModel tableModel, TableModel table) { var resultModel = await _context.Table .AsNoTracking() .Include(x => x.TableFields) .FirstOrDefaultAsync(x => x.Id == table.Id); if (resultModel == null) { return; } { if (tableModel.IsStaticFromEntityFramework) { await SyncEntityFromEntityFramework(tableModel, resultModel.Id); } else { var fieldTypeList = _context.TableFieldTypes.ToList(); var fieldConfigList = _context.TableFieldConfigs.ToList(); foreach (var item in tableModel.Fields) { foreach (var configViewModel in item.Configurations) { configViewModel.Name = fieldConfigList.FirstOrDefault(x => x.Code == configViewModel.ConfigCode)?.Name; if (configViewModel.ConfigCode != "9999") { continue; } if (configViewModel.Value == "systemcore") { configViewModel.Value = table.EntityType; } } var insertField = _tablesService.AddFieldSql(item, tableModel.Name, _connectionString, true, table.EntityType); // Save field model in the dataBase if (!insertField.Result) { continue; } { var configValues = new List <TableFieldConfigValue>(); var tableFieldType = fieldTypeList.FirstOrDefault(x => x.Code == item.TableFieldCode); if (tableFieldType == null) { continue; } var model = new TableModelField { DataType = item.DataType, TableId = resultModel.Id, Description = item.Description, Name = item.Name, DisplayName = item.DisplayName, AllowNull = item.AllowNull, Synchronized = true, TableFieldTypeId = tableFieldType.Id }; foreach (var configItem in item.Configurations) { var config = fieldConfigList.FirstOrDefault(x => x.Code == configItem.ConfigCode); if (config == null) { continue; } configValues.Add(new TableFieldConfigValue { TableFieldConfigId = config.Id, TableModelFieldId = model.Id, Value = configItem.Value, }); } model.TableFieldConfigValues = configValues; _context.TableFields.Add(model); var dbResult = await _context.SaveAsync(); if (!dbResult.IsSuccess) { Debug.WriteLine(dbResult.Errors); } } } } } }
/// <summary> /// Get entity data /// </summary> /// <param name="prop"></param> /// <param name="context"></param> /// <returns></returns> protected virtual SynchronizeTableViewModel GetEntityData(PropertyInfo prop, Type context) { var result = new SynchronizeTableViewModel(); var fields = new List <CreateTableFieldViewModel>(); var baseProps = BaseModel.GetPropsName().ToList(); var entity = prop.PropertyType.GenericTypeArguments[0]; //Exclude context not mapped entities if (Attribute.IsDefined(prop, typeof(NotMappedAttribute))) { return(null); } result.Name = prop.Name; result.IsStaticFromEntityFramework = true; result.IsSystem = true; if (context.GetField("Schema") == null) { throw new Exception("This context does not have the Schema field, which stores the schema name"); } result.Schema = context.GetField("Schema").GetValue(context).ToString(); result.Description = $"System {prop.Name} entity"; var entityProps = entity.GetProperties().Select(x => x.Name).Except(baseProps).ToList(); foreach (var field in entityProps) { var propField = entity.GetProperties().FirstOrDefault(x => x.Name.Equals(field)); if (propField == null) { continue; } var propType = propField.PropertyType.FullName; switch (propType) { case "System.String": fields.Add(new CreateTableFieldViewModel { Name = field, DisplayName = field, TableFieldCode = "10", DataType = TableFieldDataType.String, Configurations = new List <FieldConfigViewModel> { new FieldConfigViewModel { ConfigCode = "1000", Value = "500" } } }); break; case "System.Guid": var f = new CreateTableFieldViewModel { Name = field, DisplayName = field, TableFieldCode = "30", DataType = TableFieldDataType.Guid }; if (field.EndsWith("Id")) { var ent = field.Remove(field.Length - "Id".Length); if (entityProps.Contains(ent)) { f.Parameter = "EntityReference"; f.Configurations = new List <FieldConfigViewModel> { new FieldConfigViewModel { ConfigCode = TableFieldConfigCode.Reference.ForeingSchemaTable, Value = result.Schema }, new FieldConfigViewModel { ConfigCode = TableFieldConfigCode.Reference.ForeingTable, Value = ent } }; } } fields.Add(f); break; case "System.Int": case "System.Int32": fields.Add(new CreateTableFieldViewModel { Name = field, DisplayName = field, TableFieldCode = "01", DataType = TableFieldDataType.Int, Configurations = new List <FieldConfigViewModel> { new FieldConfigViewModel { ConfigCode = "0100", Value = null }, new FieldConfigViewModel { ConfigCode = "0101", Value = null } } }); break; case "System.Double": fields.Add(new CreateTableFieldViewModel { Name = field, DisplayName = field, TableFieldCode = "01", DataType = TableFieldDataType.Int, Configurations = new List <FieldConfigViewModel> { new FieldConfigViewModel { ConfigCode = "0100", Value = null }, new FieldConfigViewModel { ConfigCode = "0101", Value = null } } }); break; case "System.Boolean": fields.Add(new CreateTableFieldViewModel { Name = field, DisplayName = field, TableFieldCode = "40", DataType = TableFieldDataType.Boolean, Configurations = new List <FieldConfigViewModel> { new FieldConfigViewModel { ConfigCode = "4000", Value = null } } }); break; } } result.Fields = fields; return(result); }