Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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);
 }