private void LoadUnitRelations(XmlReader reader, IRelationType relationType) { while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name.Equals(Serialization.Relation)) { var associationString = reader.GetAttribute(Serialization.Association); var association = new ObjectIdLong(long.Parse(associationString)); if (reader.IsEmptyElement) { object role; // OnRelationNotLoaded(relationType.Id, association.ToString(), String.Empty); if (relationType.RoleType.ObjectType.Id == UnitIds.StringId) { role = string.Empty; } else if (relationType.RoleType.ObjectType.Id == UnitIds.BinaryId) { role = EmptyByteArray; } else { this.OnRelationNotLoaded(relationType.Id, association.ToString(), string.Empty); continue; } var cmdText = @" INSERT INTO " + this.Mapping.GetTableName(relationType) + " (" + Mapping.ColumnNameForAssociation + "," + Mapping.ColumnNameForRole + @") VALUES (" + Mapping.ParameterNameForAssociation + "," + Mapping.ParameterNameForRole + ")"; using (var command = this.CreateCommand(cmdText)) { command.Parameters.Add(Mapping.ParameterNameForAssociation, Mapping.DbTypeForId).Value = association.Value; command.Parameters.Add(Mapping.ParameterNameForRole, Mapping.GetSqlDbType(relationType.RoleType)).Value = role; command.ExecuteNonQuery(); } } else { var value = reader.ReadString(); try { // OnRelationNotLoaded(relationType.Id, association.ToString(), value); var unitTypeTag = ((IUnit)relationType.RoleType.ObjectType).UnitTag; var role = Serialization.ReadString(value, unitTypeTag); var cmdText = @" INSERT INTO " + this.Mapping.GetTableName(relationType) + " (" + Mapping.ColumnNameForAssociation + "," + Mapping.ColumnNameForRole + @") VALUES (" + Mapping.ParameterNameForAssociation + "," + Mapping.ParameterNameForRole + ")"; using (var command = this.CreateCommand(cmdText)) { command.Parameters.Add(Mapping.ParameterNameForAssociation, Mapping.DbTypeForId).Value = association.Value; command.Parameters.Add(Mapping.ParameterNameForRole, Mapping.GetSqlDbType(relationType.RoleType)).Value = role; command.ExecuteNonQuery(); } } catch { this.OnRelationNotLoaded(relationType.Id, association.ToString(), value); } } } break; case XmlNodeType.EndElement: return; } } }