コード例 #1
0
        public ConstraintInfo Clone(TableInfo newParent)
        {
            ConstraintInfo ci = ConstraintInfo.GetInstance(newParent);

            ci.ConstraintName     = ConstraintName;
            ci.DataConnectionSpec = DataConnectionSpec;
            ci.OnDeleteAction     = this.OnDeleteAction;
            ci.OnUpdateAction     = this.OnUpdateAction;

            // TODO: is this ok? we're not cloning the references table...
            if (ci.ReferencesTable != ci.Table)
            {
                // self-referential.  no need to clone it.
                Debug.WriteLine("NOT cloning ci.ReferencesTable as it is self-referential");
            }
            else
            {
                // pointing at a different table, clone it
                ci.ReferencesTable = this.ReferencesTable.Clone(true, true, true);
            }

            ci.ReferencesTableName = this.ReferencesTableName;
            ci.SyncAction          = SyncAction;
            ci.Table     = newParent;
            ci.TableName = newParent.TableName;
            foreach (FieldInfo fiSrc in SourceFields)
            {
                ci.SourceFields.Add(fiSrc.Clone(newParent));
            }
            ci.SourceFieldNames = SourceFieldNames.ToList();

            foreach (FieldInfo fiRef in ReferencesFields)
            {
                ci.ReferencesFields.Add(fiRef.Clone(newParent));
            }
            ci.ReferencesFieldNames = ReferencesFieldNames.ToList();

            return(ci);
        }
コード例 #2
0
        protected override void fillFromDataSet(DataSet ds, DataRow dr, List <TableInfo> tables)
        {
            TableName           = dr["table_name"].ToString().ToLower();
            ConstraintName      = dr["constraint_name"].ToString().ToLower();
            ReferencesTableName = dr["references_table_name"].ToString().ToLower();
            _tableList          = tables;
            _dsToFillFrom       = ds;
            _drToFillFrom       = dr;

            if (!mapSourceFields(ds, dr))
            {
                // source fields not found yet. means the parent of this constraint is not mapped yet.
                Debug.Write("Constraint " + ConstraintName + " from " + TableName + " to " + ReferencesTableName + " has no source fields as " + ReferencesTableName + " has not been resolved yet.");
                Debug.WriteLine("");
            }

            // make sure the reference table is mapped
            TableInfo target = null;

            if (ReferencesTableName.ToUpper().Trim() == this.TableName.ToUpper().Trim())
            {
                // self-referential
                target = this.Table;
            }
            else
            {
                foreach (TableInfo ti in tables)
                {
                    if (ti.TableName.ToUpper().Trim() == ReferencesTableName.ToUpper().Trim())
                    {
                        // table has already been inspected
                        target = ti;
                        break;
                    }
                }
            }

            if (!tables.Contains(this.Table))
            {
                tables.Add(this.Table);
            }

            this.SchemaName = this.Table.SchemaName;

            if (target == null)
            {
                // the table we are referencing hasn't been inspected yet.
                // do that now.
                DataRow[] drT = ds.Tables["TableInfo"].Select("table_name = '" + ReferencesTableName.ToLower() + "'");
                if (drT == null || drT.Length == 0)
                {
                    throw new InvalidOperationException(getDisplayMember("fillFromDataSet", "Could not find row in TableInfo table for table name={0}", ReferencesTableName.ToLower()));
                }
                else
                {
                    target = TableInfo.GetInstance(this.DataConnectionSpec);
                    target.FillFromDataSet(ds, drT[0], tables);

                    if (!tables.Exists(te => {
                        return(target.TableName.ToUpper().Trim() == te.TableName.ToUpper().Trim());
                    }))
                    {
                        tables.Add(target);
                    }
                }
            }

            ReferencesTable = target;


            DataRow[] drRefFields = ds.Tables["ConstraintReferencesFieldInfo"].Select("parent_id = " + dr["id"]);
            foreach (DataRow drRef in drRefFields)
            {
                DataRow[] drReferenceTableField = ds.Tables["TableFieldInfo"].Select("table_name = '" + ReferencesTableName.ToLower() + "' and field_name = '" + drRef["field_name"].ToString().ToLower() + "'");
                if (drReferenceTableField == null || drReferenceTableField.Length == 0)
                {
                    throw new InvalidOperationException(getDisplayMember("fillFromDataSet{reffield}", "Could not find field '{0}' in table '{1}' that constraint '{2}' in table '{3}' references.", drRef["field_name"].ToString().ToLower(), drRef["table_name"].ToString().ToLower(), this.ConstraintName.ToLower(), this.TableName.ToLower()));
                }
                FieldInfo fi = target.Fields.Find(f => {
                    return(f.Name.ToUpper().Trim() == drRef["field_name"].ToString().ToUpper().Trim());
                });
                if (fi == null)
                {
                    throw new InvalidOperationException(getDisplayMember("fillFromDataSet{reffieldmissing}", "Could not find field named {0} in table {1}", drRef["field_name"].ToString().ToLower(), target.TableName.ToLower()));
                }
                else
                {
                    SourceFields[ReferencesFields.Count].IsForeignKey        = true;
                    SourceFields[ReferencesFields.Count].ForeignKeyTable     = fi.Table;
                    SourceFields[ReferencesFields.Count].ForeignKeyTableName = fi.TableName.ToLower();
                    SourceFields[ReferencesFields.Count].ForeignKeyFieldName = fi.Name.ToLower();
                    ReferencesFields.Add(fi);
                    ReferencesFieldNames.Add(fi.Name.ToLower());
                }
            }
        }