+2008-06-19 Atsushi Enomoto <atsushi@ximian.com>
+
+ * DataRelation.cs : keep createConstraints flag for cloning in
+ DataSet.Merge(). Use different flag for initialization instead.
+ * MergeManager.cs : When cloning DataRelation, createConstraints
+ flag should depend on the source.
+ * XmlSchemaDataImporter.cs : create constraints when creating
+ DataRelation.
+
2008-06-18 Atsushi Enomoto <atsushi@ximian.com>
* DataSet.cs : when InferSchema mode, ReadXml() should do "merging
private DataColumn[] parentColumns;
private DataColumn[] childColumns;
private bool nested;
- internal bool createConstraints;
+ internal bool createConstraints = true;
+ private bool initFinished;
private PropertyCollection extendedProperties;
private PropertyChangedEventHandler onPropertyChangingDelegate;
this.RelationName = _relationName;
this.Nested = _nested;
- this.createConstraints = false;
+ this.initFinished = true;
this.extendedProperties = new PropertyCollection ();
InitInProgress = false;
#if NET_2_0
internal void UpdateConstraints ()
{
- if ( ! createConstraints)
+ if (initFinished || ! createConstraints)
return;
ForeignKeyConstraint foreignKeyConstraint = null;
DataColumn[] childColumns = ResolveColumns (targetSet.Tables [relation.ChildTable.TableName],
relation.ChildColumns);
targetRelation = targetSet.Relations.Add (relation.RelationName, parentColumns,
- childColumns, false);
+ childColumns, relation.createConstraints);
targetRelation.Nested = relation.Nested;
} else if (!CompareColumnArrays (relation.ParentColumns, targetRelation.ParentColumns) ||
!CompareColumnArrays (relation.ChildColumns, targetRelation.ChildColumns)) {
if (!c.IsConstraintOnly) {
// generate the relation.
- DataRelation rel = new DataRelation (c.ConstraintName, uniq.Columns, cols, false);
+ DataRelation rel = new DataRelation (c.ConstraintName, uniq.Columns, cols, true);
rel.Nested = c.IsNested;
rel.SetParentKeyConstraint (uniq);
rel.SetChildKeyConstraint (fkc);
+2008-06-19 Atsushi Enomoto <atsushi@ximian.com>
+
+ * TestMerge1.xml : new test file.
+ * DataSetTest2.cs : added test for Merge() to verify that it copies
+ constraints in DataRelation.
+
2008-06-18 Atsushi Enomoto <atsushi@ximian.com>
* DataTableTest.cs : do not just copy [Ignore]d tests from DataSet
ds.Merge (ds1);
Assert.AreEqual (1, ds.Relations.Count , "#1");
Assert.AreEqual (0, ds.Tables [0].Constraints.Count , "#2");
- Assert.AreEqual (0, ds.Tables [1].Constraints.Count , "#2");
+ Assert.AreEqual (0, ds.Tables [1].Constraints.Count , "#3");
}
[Test]
Assert.AreEqual (0, ds2.Tables [1].Constraints.Count, "#6");
}
+ [Test]
+ public void Merge_ConstraintsFromReadXmlSchema ()
+ {
+ DataSet ds = new DataSet ();
+ ds.ReadXml ("Test/System.Data/TestMerge1.xml");
+ DataSet ds2 = new DataSet ();
+ ds2.Merge (ds, true, MissingSchemaAction.AddWithKey);
+ DataRelation c = ds2.Tables [0].ChildRelations [0];
+ Assert.IsNotNull (c.ParentKeyConstraint, "#1");
+ Assert.IsNotNull (c.ChildKeyConstraint, "#2");
+ }
+
[Test]
[ExpectedException (typeof (DataException))]
public void Merge_MissingEventHandler ()
--- /dev/null
+<MyDataSet>
+ <xs:schema id="MyDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema"
+ xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xs:element name="MyDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Main" msdata:UseCurrentLocale="true">
+ <xs:complexType>
+ <xs:choice minOccurs="0" maxOccurs="unbounded">
+ <xs:element name="Main">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ID" type="xs:int" minOccurs="0" />
+ <xs:element name="Data" type="xs:string" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="Child">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="ID" type="xs:int" minOccurs="0" />
+ <xs:element name="PID" type="xs:int" minOccurs="0" />
+ <xs:element name="ChildData" type="xs:string" minOccurs="0" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ </xs:choice>
+ </xs:complexType>
+ <xs:unique name="Constraint1">
+ <xs:selector xpath=".//Main" />
+ <xs:field xpath="ID" />
+ </xs:unique>
+ <xs:keyref name="MainToChild" refer="Constraint1">
+ <xs:selector xpath=".//Child" />
+ <xs:field xpath="PID" />
+ </xs:keyref>
+ </xs:element>
+ </xs:schema>
+ <Main>
+ <ID>1</ID>
+ <Data>One</Data>
+ </Main>
+ <Main>
+ <ID>2</ID>
+ <Data>Two</Data>
+ </Main>
+ <Main>
+ <ID>3</ID>
+ <Data>Three</Data>
+ </Main>
+ <Child>
+ <ID>1</ID>
+ <PID>1</PID>
+ <ChildData>Parent1Child1</ChildData>
+ </Child>
+ <Child>
+ <ID>2</ID>
+ <PID>1</PID>
+ <ChildData>Parent1Child2</ChildData>
+ </Child>
+ <Child>
+ <ID>3</ID>
+ <PID>2</PID>
+ <ChildData>Parent2Child3</ChildData>
+ </Child>
+</MyDataSet>
+