public EntityClass( EntityClass parent, entitySpec entitySpec, Type type, LinkedFieldInfo fieldInfo, Action <string> log, bool throwOnCircularReference) : base(entitySpec) { log?.Invoke( $"EntityClass ctor: {entitySpec.name}/{entitySpec.fields?.Count ?? 0} - {type?.Name} - {fieldInfo?.FieldType} - {fieldInfo?.IEnumerable?.Name}"); TableName = parent != null && Spec.externalname == null ? string.Join("_", parent.TableName, ExternalName) : ExternalName; FieldInfo = fieldInfo; FieldType = fieldInfo?.FieldType; if (!Spec.Any() || isStarExpansionAndNoRealSubProperties(type)) { // not sure if this should be allowed... Fields.Add(new EntitySolitaire(type)); } breakDownSubEntities(type, log, throwOnCircularReference); // move the nosave fields to always be at the end of the list var noSaveFields = Fields.Where(_ => _.NoSave).ToList(); Fields.RemoveAll(_ => _.NoSave); SaveableFieldCount = Fields.Count; Fields.AddRange(noSaveFields); // this is temporary - to be able to serialze a contract with "*" since it was digging up so much garbage... // need to investigae each "garbage" occurrence and handle it more elegantly Fields.RemoveAll(_ => _ is EntityPlainField && SqlHelpers.Field2Sql(_.NameAndType.Name, _.NameAndType.Type, false, 0, true) == null); Lists.RemoveAll(_ => !_.Fields.Any() && !_.Lists.Any()); if (Fields.Count(_ => _.Spec.primarykey) > 1) { throw new Exception("There may be no more than one primary key field"); } PrimaryKeyIndex = Fields.FindIndex(_ => _.Spec.primarykey); EffectiveFieldCount = Fields.Count + 1; for (var fi = 0; fi < Fields.Count; fi++) { Fields[fi].ParentInitialized(this, fi); } for (var li = 0; li < Lists.Count; li++) { Lists[li].ParentInitialized(this, li); } for (var i = 0; i < Fields.Count; i++) { Fields[i].ResultSetIndex = i; } var fieldsThenFormulas = Fields.Where(_ => !(_ is EntityAggregation)).ToList(); SortWithFormulasLast(fieldsThenFormulas); _fieldsThenNonAggregatedFormulas = fieldsThenFormulas.Where(_ => !_.IsBasedOnAggregation).ToArray(); _aggregatedFormulas = fieldsThenFormulas.Where(_ => _.IsBasedOnAggregation).ToArray(); if (!string.IsNullOrEmpty(Spec.where)) { _whereClause = new WhereClause(Spec.where, Fields, _fieldsThenNonAggregatedFormulas); } if (PrimaryKeyIndex >= 0 && Fields[PrimaryKeyIndex].IsBasedOnAggregation) { throw new Exception($"The primary key must not be based on an aggregation (table '{TableName}')"); } }
public string GenerateCreateTable(string name) { var columns = string.Join(",", _dataTable.Columns.Cast <DataColumn>().Select(_ => SqlHelpers.Field2Sql(_.ColumnName, _.DataType, _.AllowDBNull, _.MaxLength))); return($"CREATE TABLE [{name}] ({columns})"); }