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
}