Author: senga
Date: 2006-01-31 11:24:59 -0500 (Tue, 31 Jan 2006)
New Revision: 56340
Modified:
branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog
branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
Log:
2006-01-31 Senganal <[EMAIL PROTECTED]>
* Test/DataSetTest.cs : Added testcase for #77411.
* System.Data/DataSet.cs : Modified CopyRelations ()
- Added code to copy ForeignKeyConstraints. Fixes #77411.
Modified: branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/System.Data/ChangeLog
2006-01-31 16:24:59 UTC (rev 56340)
@@ -1,3 +1,8 @@
+2006-01-31 Senganal T <[EMAIL PROTECTED]>
+
+ * DataSet.cs : Modified CopyRelations ()
+ - Added code to copy ForeignKeyConstraints. Fixes #77411.
+
2006-01-18 Boris Kirzner <[EMAIL PROTECTED]>
* DataColumn.cs: added PropertyCchangedEvent handling.
Modified: branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/System.Data/DataSet.cs
2006-01-31 16:24:59 UTC (rev 56340)
@@ -479,20 +479,30 @@
}
DataRelation cRel = new DataRelation
(MyRelation.RelationName, P_DC, C_DC);
- //cRel.ChildColumns = MyRelation.ChildColumns;
- //cRel.ChildTable = MyRelation.ChildTable;
- //cRel.ExtendedProperties =
cRel.ExtendedProperties;
- //cRel.Nested = MyRelation.Nested;
- //cRel.ParentColumns = MyRelation.ParentColumns;
- //cRel.ParentTable = MyRelation.ParentTable;
-
Copy.Relations.Add (cRel);
}
+
+ // Foreign Key constraints are not cloned in
DataTable.Clone
+ // so, these constraints should be cloned when copying
the relations.
+ foreach (DataTable table in this.Tables) {
+ foreach (Constraint c in table.Constraints) {
+ if (!(c is ForeignKeyConstraint)
+ ||
Copy.Tables[table.TableName].Constraints.Contains (c.ConstraintName))
+ continue;
+ ForeignKeyConstraint fc =
(ForeignKeyConstraint)c;
+ DataTable parentTable = Copy.Tables
[fc.RelatedTable.TableName];
+ DataTable currTable = Copy.Tables
[table.TableName];
+ DataColumn[] parentCols = new
DataColumn [fc.RelatedColumns.Length];
+ DataColumn[] childCols = new DataColumn
[fc.Columns.Length];
+ for (int j=0; j < parentCols.Length;
++j)
+ parentCols [j] =
parentTable.Columns[fc.RelatedColumns[j].ColumnName];
+ for (int j=0; j < childCols.Length; ++j)
+ childCols [j] =
currTable.Columns[fc.Columns[j].ColumnName];
+ currTable.Constraints.Add
(fc.ConstraintName, parentCols, childCols);
+ }
+ }
}
-
-
-
public DataSet GetChanges ()
{
return GetChanges (DataRowState.Added |
DataRowState.Deleted | DataRowState.Modified);
Modified: branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog 2006-01-31
16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/Test/ChangeLog 2006-01-31
16:24:59 UTC (rev 56340)
@@ -1,3 +1,7 @@
+2006-01-31 Senganal <[EMAIL PROTECTED]>
+
+ * DataSetTest.cs : Added testcase for #77411.
+
2006-01-02 Boris Kirzner <[EMAIL PROTECTED]>
* System.Data.Test.vmwcsproj: added new tests to TARGET_JVM project
file.
Modified:
branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
===================================================================
--- branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
2006-01-31 16:02:18 UTC (rev 56339)
+++ branches/mono-1-1-13/mcs/class/System.Data/Test/System.Data/DataSetTest.cs
2006-01-31 16:24:59 UTC (rev 56340)
@@ -1285,6 +1285,78 @@
}
[Test]
+ public void CloneCopy_TestForeignKeyConstraints ()
+ {
+ DataTable dirTable = new DataTable("Directories");
+
+ DataColumn dir_UID = new DataColumn("UID", typeof(int));
+ dir_UID.Unique = true;
+ dir_UID.AllowDBNull = false;
+
+ dirTable.Columns.Add(dir_UID);
+
+ // Build a simple Files table
+ DataTable fileTable = new DataTable("Files");
+
+ DataColumn file_DirID = new DataColumn("DirectoryID",
typeof(int));
+ file_DirID.Unique = false;
+ file_DirID.AllowDBNull = false;
+
+ fileTable.Columns.Add(file_DirID);
+
+ // Build the DataSet
+ DataSet ds = new DataSet("TestDataset");
+ ds.Tables.Add(dirTable);
+ ds.Tables.Add(fileTable);
+
+ // Add a foreign key constraint
+ DataColumn[] parentColumns = new DataColumn[1];
+ parentColumns[0] =
ds.Tables["Directories"].Columns["UID"];
+
+ DataColumn[] childColumns = new DataColumn[1];
+ childColumns[0] =
ds.Tables["Files"].Columns["DirectoryID"];
+
+ ForeignKeyConstraint fk = new
ForeignKeyConstraint("FK_Test", parentColumns, childColumns);
+ ds.Tables["Files"].Constraints.Add(fk);
+ ds.EnforceConstraints = true;
+
+ AssertEquals ("#1", 1,
ds.Tables["Directories"].Constraints.Count);
+ AssertEquals ("#2", 1,
ds.Tables["Files"].Constraints.Count);
+
+ // check clone works fine
+ DataSet cloned_ds = ds.Clone ();
+ AssertEquals ("#3", 1,
cloned_ds.Tables["Directories"].Constraints.Count);
+ AssertEquals ("#4", 1,
cloned_ds.Tables["Files"].Constraints.Count);
+
+ ForeignKeyConstraint clonedFk =
(ForeignKeyConstraint)cloned_ds.Tables["Files"].Constraints[0];
+ AssertEquals ("#5", "FK_Test", clonedFk.ConstraintName);
+ AssertEquals ("#6", 1, clonedFk.Columns.Length);
+ AssertEquals ("#7", "DirectoryID",
clonedFk.Columns[0].ColumnName);
+
+ UniqueConstraint clonedUc =
(UniqueConstraint)cloned_ds.Tables ["Directories"].Constraints[0];
+ UniqueConstraint origUc = (UniqueConstraint)ds.Tables
["Directories"].Constraints[0];
+ AssertEquals ("#8", origUc.ConstraintName,
clonedUc.ConstraintName);
+ AssertEquals ("#9", 1, clonedUc.Columns.Length);
+ AssertEquals ("#10", "UID",
clonedUc.Columns[0].ColumnName);
+
+ // check copy works fine
+ DataSet copy_ds = ds.Copy ();
+ AssertEquals ("#11", 1,
copy_ds.Tables["Directories"].Constraints.Count);
+ AssertEquals ("#12", 1,
copy_ds.Tables["Files"].Constraints.Count);
+
+ ForeignKeyConstraint copyFk =
(ForeignKeyConstraint)copy_ds.Tables["Files"].Constraints[0];
+ AssertEquals ("#13", "FK_Test", copyFk.ConstraintName);
+ AssertEquals ("#14", 1, copyFk.Columns.Length);
+ AssertEquals ("#15", "DirectoryID",
copyFk.Columns[0].ColumnName);
+
+ UniqueConstraint copyUc =
(UniqueConstraint)copy_ds.Tables ["Directories"].Constraints[0];
+ origUc = (UniqueConstraint)ds.Tables
["Directories"].Constraints[0];
+ AssertEquals ("#16", origUc.ConstraintName,
copyUc.ConstraintName);
+ AssertEquals ("#17", 1, copyUc.Columns.Length);
+ AssertEquals ("#18", "UID",
copyUc.Columns[0].ColumnName);
+ }
+
+ [Test]
public void WriteNestedTableXml ()
{
string xml = @"<NewDataSet>
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches