\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
\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
XmlHelper.Decode (attr.LocalName),\r
attr.Prefix,\r
attr.NamespaceURI,\r
- MappingType.Attribute);\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