[Mono-dev] DataSet.Merge() fix wrt DataRelation createConstraints
Nagappan A
nagappan at gmail.com
Thu Jun 19 11:29:07 EDT 2008
Hi eno,
Good to go :)
I have one question here. Now the createConstraints in DataRelation is
always going to be true ?
Thanks
Nagappan
2008/6/19 Atsushi Eno <atsushi at ximian.com>:
> Hi,
>
> This time the patch is about DataSet.Merge(). It fixes the final
> nunit test failure. DataTableReadWriteXmlTest.TestReadXml, the
> failing test, exposes failure in DataTable.Read(), but it is actually
> about DataSet.Merge() which is used in the method above.
>
> It should not create DataRelation with "createConstraints" as always
> false. It should be based on the source DataRelation.
>
> The field createConstraints should be preserved for merge, so
> I also made some fix in DataRelation too.
>
> This change exposed wrong createConstraints handling in
> XmlSchemaDataImporter too, so this patch also includes fix for it.
>
> If the fix looks good, I'll commit it later.
>
> Atsushi Eno
>
> Index: Test/System.Data/TestMerge1.xml
> ===================================================================
> --- Test/System.Data/TestMerge1.xml (revision 0)
> +++ Test/System.Data/TestMerge1.xml (revision 0)
> @@ -0,0 +1,64 @@
> +<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>
> +
> Index: Test/System.Data/DataSetTest2.cs
> ===================================================================
> --- Test/System.Data/DataSetTest2.cs (revision 106188)
> +++ Test/System.Data/DataSetTest2.cs (working copy)
> @@ -1474,7 +1474,7 @@
> 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]
> @@ -1550,6 +1550,18 @@
> }
>
> [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 ()
> {
> Index: System.Data/MergeManager.cs
> ===================================================================
> --- System.Data/MergeManager.cs (revision 106188)
> +++ System.Data/MergeManager.cs (working copy)
> @@ -223,7 +223,7 @@
> 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)) {
> Index: System.Data/XmlSchemaDataImporter.cs
> ===================================================================
> --- System.Data/XmlSchemaDataImporter.cs (revision 106188)
> +++ System.Data/XmlSchemaDataImporter.cs (working copy)
> @@ -1162,7 +1162,7 @@
>
> 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);
> Index: System.Data/DataRelation.cs
> ===================================================================
> --- System.Data/DataRelation.cs (revision 106188)
> +++ System.Data/DataRelation.cs (working copy)
> @@ -59,7 +59,8 @@
> 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;
>
> @@ -183,7 +184,7 @@
>
> this.RelationName = _relationName;
> this.Nested = _nested;
> - this.createConstraints = false;
> + this.initFinished = true;
> this.extendedProperties = new PropertyCollection ();
> InitInProgress = false;
> #if NET_2_0
> @@ -345,7 +346,7 @@
>
> internal void UpdateConstraints ()
> {
> - if ( ! createConstraints)
> + if (initFinished || ! createConstraints)
> return;
>
> ForeignKeyConstraint foreignKeyConstraint = null;
>
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
>
>
--
Linux Desktop (GUI Application) Testing Project -
http://ldtp.freedesktop.org
http://nagappanal.blogspot.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.ximian.com/pipermail/mono-devel-list/attachments/20080619/070c2b47/attachment.html
More information about the Mono-devel-list
mailing list