コード例 #1
0
        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;
                }
            }
        }