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); } } }
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); } }