示例#1
0
        public XmlViewMapping(XContainer xMapping)
        {
            var xView = xMapping.Element(XNamespace + "view");

            XAttribute xSchema;

            if (xView.TryGetAttribute("schema", out xSchema))
            {
                Schema = xSchema.Value;
            }

            Name = xView.Attribute("name").Value;

            Type = xView.Attribute("class").GetAsType();

            Properties = new List <IPropertyMapping>();
            foreach (var xProperty in xView.Elements(XNamespace + "property"))
            {
                Properties.Add(new XmlViewPropertyMapping(Type, xProperty));
            }

            XElement xDiscriminator;

            if (xView.TryGetElement(XNamespace + "discriminator", out xDiscriminator))
            {
                Discriminator = new XmlDiscriminatorColumn(xDiscriminator);
            }

            SubClasses = new List <ISubClassMapping>();
            foreach (var xSubClass in xView.Elements(XNamespace + "subclass"))
            {
                SubClasses.Add(new XmlSubClassMapping(this, XNamespace, xSubClass));
            }

            XAttribute xDiscriminatorValue;

            if (xView.TryGetAttribute("discriminator-value", out xDiscriminatorValue))
            {
                if (Discriminator == null)
                {
                    throw new DocumentParseException("Cannot parse view discriminator value, unknown discriminator type");
                }

                try
                {
                    DiscriminatorValue = TypeUtils.ParseAs(Discriminator.Type, xDiscriminatorValue.Value);
                }
                catch (Exception ex)
                {
                    throw new DocumentParseException(string.Format("Cannot parse view discriminator value '{0}' as '{1}'", xDiscriminatorValue.Value, Discriminator.Type), ex);
                }
            }
        }
示例#2
0
        public XmlTableMapping(XContainer xMapping)
        {
            var xTable = xMapping.Element(XNamespace + "table");

            XAttribute xSchema;

            if (xTable.TryGetAttribute("schema", out xSchema))
            {
                Schema = xSchema.Value;
            }

            Name = xTable.Attribute("name").Value;

            Type = xTable.Attribute("class").GetAsType();

            Properties = new List <IPropertyMapping>();
            foreach (var xProperty in xTable.Elements(XNamespace + "property"))
            {
                Properties.Add(new XmlTablePropertyMapping(Type, XNamespace, xProperty));
            }

            XElement xDiscriminator;

            if (xTable.TryGetElement(XNamespace + "discriminator", out xDiscriminator))
            {
                Discriminator = new XmlDiscriminatorColumn(xDiscriminator);
            }

            SubClasses = new List <ISubClassMapping>();
            foreach (var xSubClass in xTable.Elements(XNamespace + "subclass"))
            {
                SubClasses.Add(new XmlSubClassMapping(this, XNamespace, xSubClass));
            }

            XAttribute xDiscriminatorValue;

            if (xTable.TryGetAttribute("discriminator-value", out xDiscriminatorValue))
            {
                if (Discriminator == null)
                {
                    throw new DocumentParseException("Cannot parse table discriminator value, unknown discriminator type");
                }

                try
                {
                    DiscriminatorValue = TypeUtils.ParseAs(Discriminator.Type, xDiscriminatorValue.Value);
                }
                catch (Exception ex)
                {
                    throw new DocumentParseException(string.Format("Cannot parse table discriminator value '{0}' as '{1}'", xDiscriminatorValue.Value, Discriminator.Type), ex);
                }
            }

            XElement xVersionProperty;

            if (xTable.TryGetElement(XNamespace + "version", out xVersionProperty))
            {
                VersionProperty = new XmlVersionProperty(this, xVersionProperty);
            }

            XElement xPrimaryKey;

            if (!xTable.TryGetElement(XNamespace + "primary-key", out xPrimaryKey))
            {
                return;
            }

            PrimaryKeyProperties = new List <IPropertyMapping>();

            var properties = Properties.ToDictionary(p => p.Name);

            foreach (var xProperty in xPrimaryKey.Elements(XNamespace + "property"))
            {
                var name = xProperty.Attribute("name").Value;

                IPropertyMapping propertyMapping;
                if (!properties.TryGetValue(name, out propertyMapping))
                {
                    throw new DocumentParseException("Cannot find primary key property '{0}'", name);
                }

                PrimaryKeyProperties.Add(propertyMapping);
            }
        }