private static string GetNormalPropertyAttributes( Table t, Column c) { // need to support the following attributes // Display (needed for automatically generated form field labels) // ForeignKey (needed if foreign key column name doesn't match nav prop name + "Id") // Index (needed if index that's not primary key exists) // Inverse (needed for multiple relationships between classes) // NotMapped (needed if any nav properties) var keyNeeded = c.IsKey; var key = keyNeeded ? "Key" : ""; var commaNeeded = keyNeeded; var activeNeeded = !string.IsNullOrWhiteSpace(t.ActiveColumnName) && c.Name == t.ActiveColumnName; var active = activeNeeded ? (commaNeeded ? ", " : "") + "Active(" + (t.ActiveColumnValue ? "true" : "false") + ")" : ""; commaNeeded = commaNeeded || activeNeeded; var columnMultipleKeyCols = c.IsKey && t.PrimaryKeyColumns.Count > 1; var columnNameMismatch = c.GeneratedName != c.Name; var columnVarchar = c.Type == "varchar"; var columnNeeded = columnMultipleKeyCols || columnNameMismatch || columnVarchar; var column = columnNeeded ? (commaNeeded ? ", " : "") + "Column(" + // name (columnNameMismatch ? "\"" + c.Name + "\"" : "") + // order (columnMultipleKeyCols ? (columnNameMismatch ? ", " : "") + "Order = " + (t.PrimaryKeyColumns.IndexOf(c.Name) + 1) : "") + // typename (columnVarchar ? (columnNameMismatch || columnMultipleKeyCols ? ", " : "") + "TypeName = \"varchar\"" : "") + ")" : ""; commaNeeded = commaNeeded || columnNeeded; var databaseGeneratedNeeded = c.IsIdentity || c.IsComputed; var databaseGenerated = databaseGeneratedNeeded ? (commaNeeded ? ", " : "") + "DatabaseGenerated(DatabaseGeneratedOption." + (c.IsIdentity ? "Identity" : "Computed") + ")" : ""; commaNeeded = commaNeeded || databaseGeneratedNeeded; // for now, generate the display attribute for every field var display = (commaNeeded ? ", " : "") + "Display(Name = \"" + NamingUtil.GetDisplayName(c.Name) + "\")"; commaNeeded = true; var editableNeeded = EditableColumns.ContainsKey($"{t.TableName}.{c.Name}"); var editable = editableNeeded ? ", " + "Editable(true)" : ""; var fk = keyNeeded ? t.ForeignKeys .FirstOrDefault(a => a.Columns.Any(b => b.SourceColumn == c.Name)) : null; var foreignKeyNeeded = keyNeeded && fk != null; var srcCol = fk != null ? fk.Columns[0].SourceColumn : ""; var type = fk != null ? EntityDesignUtil.Singularize( NamingUtil.GetTableName(fk.DestinationTableName)) : ""; // TODO: need to support list of source columns var foreignKey = foreignKeyNeeded ? ", " + "ForeignKey(\"" + (SourceNavPropNames.TryGetValue( fk.SourceTableName + "." + string.Join("|", fk.Columns.Select(a => a.SourceColumn)), out var sourcePropName) ? sourcePropName : srcCol.ToLower().EndsWith("id") && srcCol.Length > 2 ? srcCol.Substring(0, srcCol.Length - 2) : type) + "\")" : ""; var indexNeeded = t.Indexes .Any(a => a.Columns.Contains(c.Name)); var index = ""; t.Indexes .Where(a => a.Columns.Contains(c.Name)) .ToList() .ForEach(a => { index += (string.IsNullOrWhiteSpace(index) ? "" : ", ") + "Index(\"" + a.Name + "\"" + (a.Columns.Count > 1 ? ", " + (a.Columns.IndexOf(c.Name) + 1).ToString() : "") + ")"; }); index = string.IsNullOrWhiteSpace(index) ? "" : (commaNeeded ? ", " : "") + index; commaNeeded = commaNeeded || indexNeeded; var maxLengthNeeded = c.ClrType == "string" && c.Type != "text" && c.Length > -1; var maxLength = maxLengthNeeded ? (commaNeeded ? ", " : "") + "MaxLength(" + (c.Type == "varchar" || c.Type == "char" ? c.Length : c.Length / 2) + ")" : ""; commaNeeded = commaNeeded || maxLengthNeeded; var modelTableNeeded = ExcludeFieldsFromModelTable.ContainsKey( $"{t.TableName}.{c.Name}"); var modelTable = modelTableNeeded ? (commaNeeded ? ", " : "") + "ModelTable(true)" : ""; commaNeeded = commaNeeded || modelTableNeeded; var requiredNeeded = c.ClrType == "string" && !c.IsNullable && c.DefaultValue == null; var required = requiredNeeded ? (commaNeeded ? ", " : "") + "Required(AllowEmptyStrings = true)" : ""; var attrNeeded = commaNeeded || requiredNeeded; var attr = attrNeeded ? "[" + key + active + column + databaseGenerated + display + editable + foreignKey + index + maxLength + modelTable + required + "]" : ""; return(attr); }
static TableGenerator() { CreateDateFieldNames = TemplateConstants.CreateDateFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); DestNavPropNames = new Dictionary <string, string>(); TemplateConstants.DestinationNavigationPropertyNames .Split(',') .ToList() .ForEach(a => { var parts = a.Split(':'); DestNavPropNames.Add( parts[0].Trim(), parts[1].Trim()); }); EditableColumns = TemplateConstants.EditableColumns .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .Select(a => a.Trim()) .ToDictionary(a => a, a => a); EndDateFieldNames = TemplateConstants.EndDateFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); ExcludePopulateDatesInterface = TemplateConstants.ExcludePopulateDatesInterface .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); ExcludeFieldsFromModelTable = TemplateConstants.ExcludeFieldsFromModelTable .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .Select(a => a.Trim()) .ToDictionary(a => a, a => a); ModelsSubclassEffDateExcludedColumns = TemplateConstants.ModelsSubclassEffDateExcludedColumns .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .Select(a => a.Trim()) .ToDictionary(a => a, a => a); ModifiedDateFieldNames = TemplateConstants.ModifiedDateFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); NavPropDisplayNames = new Dictionary <string, string>(); TemplateConstants.NavigationPropertyDisplayNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .ForEach(a => { var parts = a.Split(':'); NavPropDisplayNames.Add( parts[0].Trim(), parts.Length < 2 || string.IsNullOrWhiteSpace(parts[1]) ? NamingUtil.GetDisplayName(parts[0].Trim().Split('.')[1]) : parts[1].Trim()); }); NavPropsToSkip = TemplateConstants.NavigationPropertiesToSkip .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Trim()) .ToDictionary(a => a); NewKeywordColumns = TemplateConstants.NewKeywordColumns .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Trim()) .ToDictionary(a => a); OverrideColumns = TemplateConstants.OverrideColumns .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Trim()) .ToDictionary(a => a); SourceNavPropNames = new Dictionary <string, string>(); TemplateConstants.SourceNavigationPropertyNames .Split(',') .ToList() .ForEach(a => { var parts = a.Split(':'); SourceNavPropNames.Add( parts[0].Trim(), parts[1].Trim()); }); StartDateFieldNames = TemplateConstants.StartDateFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); IsActiveFieldNames = TemplateConstants.IsActiveFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); DeactivatedDateFieldNames = TemplateConstants.DeactivatedDateFieldNames .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToDictionary(a => a); TablesToOptOutOfSubClass = TemplateConstants.TablesToOptOutOfSubClass .Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .Select(a => a.Trim()) .ToDictionary(a => a); }