Ejemplo n.º 1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Column" /> class.
        /// </summary>
        /// <param name="tSqlObject">The TSqlObject representing the column.</param>
        /// <param name="tSqlTable">The table or view this column belongs to.</param>
        /// <param name="primaryKeys">The primary keys.</param>
        /// <param name="foreignKeys">The foreign keys.</param>
        public Column(dac.TSqlObject tSqlObject)
        {
            this.Name = tSqlObject.Name.Parts.Last();

            if (tSqlObject.ObjectType.Name == "TableTypeColumn")
            {
                var sqlDataTypeName = tSqlObject.GetReferenced(dac.TableTypeColumn.DataType).ToList().First().Name.Parts.Last();
                this.DataTypes  = DataTypeHelper.Instance.GetMap(TypeFormat.SqlServerDbType, sqlDataTypeName);
                this.IsIdentity = dac.TableTypeColumn.IsIdentity.GetValue <bool>(tSqlObject);
                this.IsNullable = dac.TableTypeColumn.Nullable.GetValue <bool>(tSqlObject);
                this.Precision  = dac.TableTypeColumn.Precision.GetValue <int>(tSqlObject);
                this.Scale      = dac.TableTypeColumn.Scale.GetValue <int>(tSqlObject);
                this.Length     = dac.TableTypeColumn.Length.GetValue <int>(tSqlObject);
            }
            else
            {
                dac.ColumnType metaType = tSqlObject.GetMetadata <dac.ColumnType>(dac.Column.ColumnType);

                switch (metaType)
                {
                case dac.ColumnType.Column:
                case dac.ColumnType.ColumnSet:
                    SetProperties(tSqlObject);
                    break;

                case dac.ColumnType.ComputedColumn:
                    // use the referenced column - this works for simple view referenced
                    // column but not for a computed expression like [Name] = [FirstName] + ' ' + [LastName]
                    var referenced = tSqlObject.GetReferenced().ToArray();
                    if (referenced.Length == 1)
                    {
                        var tSqlObjectReferenced = referenced[0];
                        SetProperties(tSqlObjectReferenced);
                    }
                    else
                    {
                        // TODO: how to get and evaluate the expression?
                    }
                    break;
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Column" /> class.
        /// </summary>
        /// <param name="tSqlObject">The TSqlObject representing the column.</param>
        /// <param name="tSqlTable">The table or view this column belongs to.</param>
        /// <param name="primaryKeys">The primary keys.</param>
        /// <param name="foreignKeys">The foreign keys.</param>
        public Column(dac.TSqlObject tSqlObject, dac.TSqlObject tSqlTable, IEnumerable <dac.TSqlObject> primaryKeys, IDictionary <dac.TSqlObject, IEnumerable <ForeignKeyConstraintDefinition> > foreignKeys)
        {
            this.Name = tSqlObject.Name.Parts.Last();
            var fullName = string.Join(".", tSqlObject.Name.Parts);

            this.IsPrimaryKey = primaryKeys.Any(p => string.Join(".", p.Name.Parts) == fullName);

            // Get relationships where this column is the child.
            IEnumerable <ForeignKeyConstraintDefinition> myForeignKeys;

            foreignKeys.TryGetValue(tSqlTable, out myForeignKeys);
            myForeignKeys            = myForeignKeys ?? Enumerable.Empty <ForeignKeyConstraintDefinition>();
            this.ParentRelationships = from f in myForeignKeys
                                       where f.Columns.Any(c => c.Value == this.Name)
                                       select new RelationshipIdentifier
            {
                TableOrView = f.ReferenceTableName.BaseIdentifier != null ? f.ReferenceTableName.BaseIdentifier.Value : null,
                Schema      = f.ReferenceTableName.SchemaIdentifier != null ? f.ReferenceTableName.SchemaIdentifier.Value : null,
                Database    = f.ReferenceTableName.DatabaseIdentifier != null ? f.ReferenceTableName.DatabaseIdentifier.Value : null,
                Columns     = f.ReferencedTableColumns.Select(c => c.Value)
            };
            this.IsForeignKey = this.ParentRelationships.Any();

            // Get relationships where this column is the parent.
            var childTables = foreignKeys.Where(f => f.Value.Any(v =>
                                                                 v.ReferenceTableName.BaseIdentifier.Value == tSqlTable.Name.Parts.Last() &&
                                                                 v.ReferencedTableColumns.Any(c => c.Value == this.Name)));

            this.ChildRelationships = from t in childTables
                                      from r in t.Value
                                      let tableParts = t.Key.Name.Parts.Count()
                                                       select new RelationshipIdentifier
            {
                TableOrView = t.Key.Name.Parts.Last(),
                Schema      = tableParts > 1 ? t.Key.Name.Parts.ElementAt(tableParts - 2) : null,
                Database    = tableParts > 2 ? t.Key.Name.Parts.ElementAt(tableParts - 3) : null,
                Columns     = r.Columns.Select(c => c.Value)
            };

            if (tSqlObject.ObjectType.Name == "TableTypeColumn")
            {
                var sqlDataTypeName = tSqlObject.GetReferenced(dac.TableTypeColumn.DataType).ToList().First().Name.Parts.Last();
                this.DataTypes  = DataTypeHelper.Instance.GetMap(TypeFormat.SqlServerDbType, sqlDataTypeName);
                this.IsIdentity = dac.TableTypeColumn.IsIdentity.GetValue <bool>(tSqlObject);
                this.IsNullable = dac.TableTypeColumn.Nullable.GetValue <bool>(tSqlObject);
                this.Precision  = dac.TableTypeColumn.Precision.GetValue <int>(tSqlObject);
                this.Scale      = dac.TableTypeColumn.Scale.GetValue <int>(tSqlObject);
                this.Length     = dac.TableTypeColumn.Length.GetValue <int>(tSqlObject);
            }
            else
            {
                dac.ColumnType metaType = tSqlObject.GetMetadata <dac.ColumnType>(dac.Column.ColumnType);

                switch (metaType)
                {
                case dac.ColumnType.Column:
                case dac.ColumnType.ColumnSet:
                    SetProperties(tSqlObject);
                    break;

                case dac.ColumnType.ComputedColumn:
                    // use the referenced column - this works for simple view referenced
                    // column but not for a computed expression like [Name] = [FirstName] + ' ' + [LastName]
                    var referenced = tSqlObject.GetReferenced().ToArray();
                    if (referenced.Length == 1)
                    {
                        var tSqlObjectReferenced = referenced[0];
                        SetProperties(tSqlObjectReferenced);
                    }
                    else
                    {
                        // TODO: how to get and evaluate the expression?
                    }
                    break;
                }
            }
        }