2 // System.Data.DataRelation.cs
5 // Daniel Morgan <danmorg@sc.rr.com>
6 // Alan Tam Siu Lung <Tam@SiuLung.com>
7 // Tim Coleman <tim@timcoleman.com>
9 // (C) 2002 Daniel Morgan
10 // (C) 2002 Ximian, Inc.
11 // Copyright (C) Tim Coleman, 2003
15 using System.ComponentModel;
16 using System.Runtime.Serialization;
21 /// DataRelation is used for a parent/child relationship
22 /// between two DataTable objects
25 [DefaultProperty ("RelationName")]
27 public class DataRelation {
28 private DataSet dataSet;
29 private string relationName;
30 private UniqueConstraint parentKeyConstraint;
31 private ForeignKeyConstraint childKeyConstraint;
32 private DataColumn[] parentColumns;
33 private DataColumn[] childColumns;
35 internal bool createConstraints;
36 private PropertyCollection extendedProperties;
37 private PropertyChangedEventHandler onPropertyChangingDelegate;
41 public DataRelation (string relationName, DataColumn parentColumn, DataColumn childColumn)
42 : this(relationName, parentColumn, childColumn, true)
46 public DataRelation (string relationName, DataColumn[] parentColumns, DataColumn[] childColumns)
47 : this(relationName, parentColumns, childColumns, true)
51 public DataRelation (string relationName, DataColumn parentColumn, DataColumn childColumn, bool createConstraints)
52 : this(relationName, new DataColumn[] { parentColumn }, new DataColumn[] { childColumn }, createConstraints)
56 public DataRelation (string relationName, DataColumn[] parentColumns, DataColumn[] childColumns, bool createConstraints)
58 this.extendedProperties = new PropertyCollection();
59 if (relationName == null) relationName = string.Empty;
60 this.relationName = relationName;
61 if (parentColumns == null) throw new ArgumentNullException ();
62 this.parentColumns = parentColumns;
63 if (childColumns == null) throw new ArgumentNullException ();
64 this.childColumns = childColumns;
65 this.createConstraints = createConstraints;
66 if (parentColumns.Length != childColumns.Length)
67 throw new ArgumentException ("ParentColumns and ChildColumns should be the same length");
68 DataTable parentTable = parentColumns[0].Table;
69 DataTable childTable = childColumns[0].Table;
70 if (parentTable.DataSet != childTable.DataSet)
71 throw new InvalidConstraintException ();
72 foreach (DataColumn column in parentColumns)
73 if (column.Table != parentTable)
74 throw new InvalidConstraintException ();
75 foreach (DataColumn column in childColumns)
76 if (column.Table != childTable)
77 throw new InvalidConstraintException ();
82 public DataRelation (string relationName, string parentTableName, string childTableName, string[] parentColumnNames, string[] childColumnNames, bool nested)
84 throw new NotImplementedException ();
89 public DataRelation (string relationName, string parentTableName, string parentTableNamespace, string childTableName, string childTableNamespace, string[] parentColumnNames, string[] childColumnNames, bool nested)
91 throw new NotImplementedException ();
95 #endregion // Constructors
99 [DataCategory ("Data")]
100 [DataSysDescription ("Indicates the child columns of this relation.")]
101 public virtual DataColumn[] ChildColumns {
107 public virtual ForeignKeyConstraint ChildKeyConstraint {
109 return childKeyConstraint;
113 internal void SetChildKeyConstraint(ForeignKeyConstraint foreignKeyConstraint) {
114 childKeyConstraint = foreignKeyConstraint;
117 public virtual DataTable ChildTable {
119 return childColumns[0].Table;
124 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
125 public virtual DataSet DataSet {
127 return childColumns[0].Table.DataSet;
132 [DataCategory ("Data")]
133 [DataSysDescription ("The collection that holds custom user information.")]
134 public PropertyCollection ExtendedProperties {
136 if (extendedProperties == null)
137 extendedProperties = new PropertyCollection();
138 return extendedProperties;
142 [DataCategory ("Data")]
143 [DataSysDescription ("Indicates whether relations are nested.")]
144 [DefaultValue (false)]
145 public virtual bool Nested {
155 [DataCategory ("Data")]
156 [DataSysDescription ("Indicates the parent columns of this relation.")]
157 public virtual DataColumn[] ParentColumns {
159 return parentColumns;
163 public virtual UniqueConstraint ParentKeyConstraint {
165 return parentKeyConstraint;
169 internal void SetParentKeyConstraint(UniqueConstraint uniqueConstraint) {
170 parentKeyConstraint = uniqueConstraint;
173 internal void SetDataSet(DataSet ds) {
177 public virtual DataTable ParentTable {
179 return parentColumns[0].Table;
183 [DataCategory ("Data")]
184 [DataSysDescription ("The name used to look up this relation in the Relations collection of a DataSet.")]
186 public virtual string RelationName {
192 relationName = value;
196 #endregion // Properties
200 protected void CheckStateForProperty ()
202 // TODO: check consistency of constraints
203 DataTable parentTable = parentColumns[0].Table;
204 DataTable childTable = parentColumns[0].Table;
205 if (parentTable.DataSet != childTable.DataSet)
206 throw new DataException ();
207 bool allColumnsEqual = false;
208 for (int colCnt = 0; colCnt < parentColumns.Length; ++colCnt) {
209 if (!parentColumns [colCnt].DataType.Equals (childColumns [colCnt].DataType))
210 throw new DataException ();
211 if (parentColumns [colCnt] != childColumns [colCnt]) allColumnsEqual = false;
213 if (allColumnsEqual) throw new DataException ();
216 protected internal void OnPropertyChanging (PropertyChangedEventArgs pcevent)
218 if (onPropertyChangingDelegate != null)
219 onPropertyChangingDelegate (this, pcevent);
222 protected internal void RaisePropertyChanging (string name)
224 OnPropertyChanging(new PropertyChangedEventArgs(name));
227 public override string ToString ()
232 #endregion // Methods