public DataColumn SimpleContent;\r
public DataColumn PrimaryKey;\r
public DataColumn ReferenceKey;\r
-#if NET_2_0\r
public int lastElementIndex = -1;\r
-#endif\r
\r
// Parent TableMapping\r
public TableMapping ParentTable;\r
\r
int count = 0; \r
foreach (TableMapping map in tables) {\r
+ string baseName = map.PrimaryKey != null ? map.PrimaryKey.ColumnName : map.Table.TableName + "_Id";\r
\r
// Make sure name of RK column is unique\r
- string rkName = map.Table.TableName + "_Id";\r
+ string rkName = baseName;\r
if (map.ChildTables [map.Table.TableName] != null) {\r
- rkName = map.Table.TableName + "_Id_" + count;\r
+ rkName = baseName + '_' + count;\r
while (map.GetColumn (rkName) != null) {\r
count++;\r
- rkName = map.Table.TableName + "_Id_" + count;\r
+ rkName = baseName + '_' + count;\r
}\r
}\r
\r
foreach (TableMapping ct in map.ChildTables) {\r
- ct.ReferenceKey = GetMappedColumn (ct, rkName, map.Table.Prefix, map.Table.Namespace, MappingType.Hidden);\r
+ ct.ReferenceKey = GetMappedColumn (ct, rkName, map.Table.Prefix, map.Table.Namespace, MappingType.Hidden, map.PrimaryKey != null ? map.PrimaryKey.DataType : typeof (int));\r
}\r
}\r
\r
if (col != null) {\r
if (col.ColumnMapping != MappingType.Element)\r
throw new DataException (String.Format ("Column {0} is already mapped to {1}.", localName, col.ColumnMapping));\r
-#if NET_2_0\r
table.lastElementIndex = table.Elements.IndexOf (col);\r
-#endif\r
return;\r
}\r
if (table.ChildTables [localName] != null)\r
col = new DataColumn (localName, typeof (string));\r
col.Namespace = el.NamespaceURI;\r
col.Prefix = el.Prefix;\r
-#if NET_2_0\r
table.Elements.Insert (++table.lastElementIndex, col);\r
-#else\r
- table.Elements.Add (col);\r
-#endif\r
}\r
\r
private void CheckExtraneousElementColumn (TableMapping parentTable, XmlElement el)\r
\r
private void PopulatePrimaryKey (TableMapping table)\r
{\r
- if (table.PrimaryKey != null) {\r
- if (table.PrimaryKey.ColumnName != table.Table.TableName + "_Id")\r
- throw new DataException ("There is already a primary key column.");\r
- return;\r
- }\r
DataColumn col = new DataColumn (table.Table.TableName + "_Id");\r
col.ColumnMapping = MappingType.Hidden;\r
col.DataType = typeof (int);\r
table.PrimaryKey = col;\r
}\r
\r
- private void PopulateRelationStructure (string parent, string child)\r
+ private void PopulateRelationStructure (string parent, string child, string pkeyColumn)\r
{\r
if (relations [parent, child] != null)\r
return;\r
RelationStructure rs = new RelationStructure ();\r
rs.ParentTableName = parent;\r
rs.ChildTableName = child;\r
- rs.ParentColumnName = parent + "_Id";\r
- rs.ChildColumnName = parent + "_Id";\r
+ rs.ParentColumnName = pkeyColumn;\r
+ rs.ChildColumnName = pkeyColumn;\r
rs.CreateConstraint = true;\r
rs.IsNested = true;\r
relations.Add (rs);\r
if (table.SimpleContent != null)\r
return;\r
\r
- GetMappedColumn (table, localName + "_Column", el.Prefix, el.NamespaceURI, MappingType.SimpleContent);\r
+ GetMappedColumn (table, localName + "_Column", el.Prefix, el.NamespaceURI, MappingType.SimpleContent, null);\r
}\r
\r
private void InferTableElement (TableMapping parentTable, XmlElement el)\r
\r
foreach (XmlAttribute attr in el.Attributes) {\r
if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
|| attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
)\r
continue;\r
if (ignoredNamespaces != null &&\r
continue;\r
\r
hasAttributes = true;\r
- DataColumn col = GetMappedColumn (table,\r
+ GetMappedColumn (table,\r
XmlHelper.Decode (attr.LocalName),\r
attr.Prefix,\r
- attr.NamespaceURI,\r
- MappingType.Attribute);\r
+ attr.NamespaceURI,\r
+ MappingType.Attribute,\r
+ null); \r
}\r
\r
foreach (XmlNode n in el.ChildNodes) {\r
InferColumnElement (table, cel);\r
break;\r
case ElementMappingType.Repeated:\r
- PopulatePrimaryKey (table);\r
- PopulateRelationStructure (table.Table.TableName, childLocalName);\r
+ if (table.PrimaryKey == null)\r
+ PopulatePrimaryKey (table);\r
+ PopulateRelationStructure (table.Table.TableName, childLocalName, table.PrimaryKey.ColumnName);\r
InferRepeatedElement (table, cel);\r
break;\r
case ElementMappingType.Complex:\r
- PopulatePrimaryKey (table);\r
- PopulateRelationStructure (table.Table.TableName, childLocalName);\r
+ if (table.PrimaryKey == null)\r
+ PopulatePrimaryKey (table);\r
+ PopulateRelationStructure (table.Table.TableName, childLocalName, table.PrimaryKey.ColumnName);\r
InferTableElement (table, cel);\r
break;\r
}\r
// Attributes + !Children + Text = SimpleContent\r
if (table.SimpleContent == null // no need to create\r
&& !hasChildElements && hasText && (hasAttributes || isElementRepeated)) {\r
- GetMappedColumn (table, table.Table.TableName + "_Text", String.Empty, String.Empty, MappingType.SimpleContent);\r
+ GetMappedColumn (table, table.Table.TableName + "_Text", String.Empty, String.Empty, MappingType.SimpleContent, null);\r
}\r
}\r
\r
return map;\r
}\r
\r
- private DataColumn GetMappedColumn (TableMapping table, string name, string prefix, string ns, MappingType type)\r
+ private DataColumn GetMappedColumn (TableMapping table, string name, string prefix, string ns, MappingType type, Type optColType)\r
{\r
DataColumn col = table.GetColumn (name);\r
// Infer schema\r
break;\r
case MappingType.Hidden:\r
// To generate parent key\r
- col.DataType = typeof (int);\r
+ col.DataType = optColType;\r
table.ReferenceKey = col;\r
break;\r
}\r
\r
foreach (XmlAttribute attr in el.Attributes) {\r
if (attr.NamespaceURI == XmlConstants.XmlnsNS \r
-#if NET_2_0\r
|| attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
)\r
continue;\r
if (ignoredNamespaces != null && ignoredNamespaces.Contains (attr.NamespaceURI))\r
{\r
foreach (XmlAttribute attr in top.Attributes) {\r
if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
|| attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
)\r
continue;\r
if (ignoredNamespaces != null &&\r
// Returns if it "might" be a column element (this method is\r
// called per child element, thus it might still consist of\r
// table, since it might be repeated).\r
+ /*\r
private bool IsPossibleColumnElement (XmlElement el)\r
{\r
foreach (XmlAttribute attr in el.Attributes) {\r
if (attr.NamespaceURI == XmlConstants.XmlnsNS\r
-#if NET_2_0\r
|| attr.NamespaceURI == XmlConstants.XmlNS\r
-#endif\r
)\r
continue;\r
return false;\r
return false;\r
return true;\r
}\r
+ */\r
}\r
}\r
\r