2 // System.Data.DataRelation.cs
5 // Daniel Morgan <danmorg@sc.rr.com>
6 // Alan Tam Siu Lung <Tam@SiuLung.com>
8 // (C) 2002 Daniel Morgan
9 // (C) 2002 Ximian, Inc.
13 using System.ComponentModel;
14 using System.Runtime.Serialization;
19 /// DataRelation is used for a parent/child relationship
20 /// between two DataTable objects
23 [DefaultProperty ("RelationName")]
25 public class DataRelation {
26 private DataSet dataSet;
27 private string relationName;
28 private UniqueConstraint parentKeyConstraint;
29 private ForeignKeyConstraint childKeyConstraint;
30 private DataColumn[] parentColumns;
31 private DataColumn[] childColumns;
33 internal bool createConstraints;
34 private PropertyCollection extendedProperties;
35 private PropertyChangedEventHandler onPropertyChangingDelegate;
39 public DataRelation (string relationName, DataColumn parentColumn, DataColumn childColumn)
40 : this(relationName, parentColumn, childColumn, true)
44 public DataRelation (string relationName, DataColumn[] parentColumns, DataColumn[] childColumns)
45 : this(relationName, parentColumns, childColumns, true)
49 public DataRelation (string relationName, DataColumn parentColumn, DataColumn childColumn, bool createConstraints)
50 : this(relationName, new DataColumn[] { parentColumn }, new DataColumn[] { childColumn }, createConstraints)
54 public DataRelation (string relationName, DataColumn[] parentColumns, DataColumn[] childColumns, bool createConstraints)
56 this.extendedProperties = new PropertyCollection();
57 if (relationName == null) relationName = string.Empty;
58 this.relationName = relationName;
59 if (parentColumns == null) throw new ArgumentNullException ();
60 this.parentColumns = parentColumns;
61 if (childColumns == null) throw new ArgumentNullException ();
62 this.childColumns = childColumns;
63 this.createConstraints = createConstraints;
64 if (parentColumns.Length != childColumns.Length)
65 throw new InvalidConstraintException ();
66 DataTable parentTable = parentColumns[0].Table;
67 DataTable childTable = childColumns[0].Table;
68 if (parentTable.DataSet != childTable.DataSet)
69 throw new InvalidConstraintException ();
70 foreach (DataColumn column in parentColumns)
71 if (column.Table != parentTable)
72 throw new InvalidConstraintException ();
73 foreach (DataColumn column in childColumns)
74 if (column.Table != childTable)
75 throw new InvalidConstraintException ();
80 public DataRelation (string relationName, string parentTableName, string childTableName, string[] parentColumnNames, string[] childColumnNames, bool nested)
82 throw new NotImplementedException ();
85 #endregion // Constructors
89 [DataCategory ("Data")]
90 [DataSysDescription ("Indicates the child columns of this relation.")]
91 public virtual DataColumn[] ChildColumns {
97 public virtual ForeignKeyConstraint ChildKeyConstraint {
99 return childKeyConstraint;
103 internal void SetChildKeyConstraint(ForeignKeyConstraint foreignKeyConstraint) {
104 childKeyConstraint = foreignKeyConstraint;
107 public virtual DataTable ChildTable {
109 return childColumns[0].Table;
114 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
115 public virtual DataSet DataSet {
117 return childColumns[0].Table.DataSet;
122 [DataCategory ("Data")]
123 [DataSysDescription ("The collection that holds custom user information.")]
124 public PropertyCollection ExtendedProperties {
126 if (extendedProperties == null)
127 extendedProperties = new PropertyCollection();
128 return extendedProperties;
132 [DataCategory ("Data")]
133 [DataSysDescription ("Indicates whether relations are nested.")]
134 [DefaultValue (false)]
135 public virtual bool Nested {
145 [DataCategory ("Data")]
146 [DataSysDescription ("Indicates the parent columns of this relation.")]
147 public virtual DataColumn[] ParentColumns {
149 return parentColumns;
153 public virtual UniqueConstraint ParentKeyConstraint {
155 return parentKeyConstraint;
159 internal void SetParentKeyConstraint(UniqueConstraint uniqueConstraint) {
160 parentKeyConstraint = uniqueConstraint;
163 internal void SetDataSet(DataSet ds) {
167 public virtual DataTable ParentTable {
169 return parentColumns[0].Table;
173 [DataCategory ("Data")]
174 [DataSysDescription ("The name used to look up this relation in the Relations collection of a DataSet.")]
176 public virtual string RelationName {
182 relationName = value;
186 #endregion // Properties
190 protected void CheckStateForProperty ()
192 // TODO: check consistency of constraints
193 DataTable parentTable = parentColumns[0].Table;
194 DataTable childTable = parentColumns[0].Table;
195 if (parentTable.DataSet != childTable.DataSet)
196 throw new DataException ();
197 bool allColumnsEqual = false;
198 for (int colCnt = 0; colCnt < parentColumns.Length; ++colCnt) {
199 if (!parentColumns [colCnt].DataType.Equals (childColumns [colCnt].DataType))
200 throw new DataException ();
201 if (parentColumns [colCnt] != childColumns [colCnt]) allColumnsEqual = false;
203 if (allColumnsEqual) throw new DataException ();
206 protected internal void OnPropertyChanging (PropertyChangedEventArgs pcevent)
208 if (onPropertyChangingDelegate != null)
209 onPropertyChangingDelegate (this, pcevent);
212 protected internal void RaisePropertyChanging (string name)
214 OnPropertyChanging(new PropertyChangedEventArgs(name));
217 public override string ToString ()
222 #endregion // Methods