System.Data.XmlSchemaWriter.AddForeignKeys C# (CSharp) Method

AddForeignKeys() private method

private AddForeignKeys ( DataRelation rel, ArrayList names, bool isConstraintOnly ) : void
rel DataRelation
names System.Collections.ArrayList
isConstraintOnly bool
return void
		private void AddForeignKeys (DataRelation rel, ArrayList names, bool isConstraintOnly)
		{
			// Do nothing if it contains hidden relation
			foreach (DataColumn col in rel.ParentColumns)
				if (col.ColumnMapping == MappingType.Hidden)
					return;
			foreach (DataColumn col in rel.ChildColumns)
				if (col.ColumnMapping == MappingType.Hidden)
					return;

			w.WriteStartElement ("xs", "keyref", xmlnsxs);
			w.WriteAttributeString ("name", XmlHelper.Encode (rel.RelationName));

			//ForeignKeyConstraint fkConst = rel.ChildKeyConstraint;
			UniqueConstraint uqConst = null; 

			if (isConstraintOnly) {
				foreach (Constraint c in rel.ParentTable.Constraints) {
					uqConst = c as UniqueConstraint;
					if (uqConst == null)
						continue;
					if (uqConst.Columns == rel.ParentColumns)
						break;
				}
			} 
			else
				uqConst = rel.ParentKeyConstraint;

			string concatName = XmlHelper.Encode (rel.ParentTable.TableName) + "_" + XmlHelper.Encode (uqConst.ConstraintName);
			// first try to find the concatenated name. If we didn't find it - use constraint name.
			if (names.Contains (concatName)) {
				w.WriteStartAttribute ("refer", String.Empty);
				w.WriteQualifiedName (concatName, dataSetNamespace);
				w.WriteEndAttribute ();
			}
			else {
				w.WriteStartAttribute ("refer", String.Empty);
				w.WriteQualifiedName (XmlHelper.Encode (uqConst.ConstraintName), dataSetNamespace);
				w.WriteEndAttribute ();
			}

			if (isConstraintOnly)
				w.WriteAttributeString ( XmlConstants.MsdataPrefix,
					XmlConstants.ConstraintOnly,
					XmlConstants.MsdataNamespace,
					"true");
			else if (rel.Nested)
				w.WriteAttributeString (
					XmlConstants.MsdataPrefix,
					XmlConstants.IsNested,
					XmlConstants.MsdataNamespace,
					"true");

			AddExtendedPropertyAttributes (uqConst.ExtendedProperties);

			w.WriteStartElement ("xs", "selector", xmlnsxs);
			w.WriteAttributeString ("xpath", ".//" + 
				ConstraintPrefix + XmlHelper.Encode (rel.ChildTable.TableName));
			w.WriteEndElement ();

			foreach (DataColumn c in rel.ChildColumns) {
				w.WriteStartElement ("xs", "field",
					xmlnsxs);
				w.WriteStartAttribute ("xpath", String.Empty);
				if (c.ColumnMapping == MappingType.Attribute)
					w.WriteString ("@");
				w.WriteString (ConstraintPrefix);
				w.WriteString (XmlHelper.Encode (c.ColumnName));
				w.WriteEndAttribute ();
				w.WriteEndElement (); // field
			}

			w.WriteEndElement (); // keyref
		}