public static DesignTimeMetadata FromXML(string xml) { DesignTimeMetadata metadata = new DesignTimeMetadata(); XDocument xdoc = XDocument.Parse(xml); XElement xmetadata = xdoc.Element(NS_DATA + "Metadata"); XElement xdbSets = xmetadata.Element(NS_DATA + "Metadata.DbSets"); IEnumerable <XProcessingInstruction> ximports = xmetadata.Nodes().Where(n => n is XProcessingInstruction && (n as XProcessingInstruction).Target == "import").Cast <XProcessingInstruction>(); foreach (XProcessingInstruction xpc in ximports) { metadata.TypeScriptImports.Add(xpc.Data); } if (xdbSets != null) { foreach (XElement xdbSet in xdbSets.Elements(NS_DATA + "DbSetInfo")) { string xType = xdbSet.Attribute("EntityType").Value; Type _entityType = _GetTypeFromXType(xType, xdoc); DbSetInfo dbSetInfo = new DbSetInfo { dbSetName = (string)xdbSet.Attribute("dbSetName") }; dbSetInfo.SetEntityType(_entityType); if (xdbSet.Attributes("enablePaging").Any()) { dbSetInfo.enablePaging = (bool)xdbSet.Attribute("enablePaging"); } if (xdbSet.Attributes("pageSize").Any()) { dbSetInfo.pageSize = (int)xdbSet.Attribute("pageSize"); } if (xdbSet.Attributes("isTrackChanges").Any()) { dbSetInfo.SetIsTrackChanges((bool)xdbSet.Attribute("isTrackChanges")); } metadata.DbSets.Add(dbSetInfo); XElement xFields = xdbSet.Element(NS_DATA + "DbSetInfo.fieldInfos"); IEnumerable <XElement> fields = xFields.Elements(NS_DATA + "Field"); dbSetInfo.fieldInfos.AddRange(_XElementsToFieldList(fields)); } } XElement xAssocs = xmetadata.Element(NS_DATA + "Metadata.Associations"); if (xAssocs != null) { foreach (XElement xAssoc in xAssocs.Elements(NS_DATA + "Association")) { Association assoc = new Association { name = (string)xAssoc.Attribute("name") }; if (xAssoc.Attributes("parentDbSetName").Any()) { assoc.parentDbSetName = (string)xAssoc.Attribute("parentDbSetName"); } if (xAssoc.Attributes("childDbSetName").Any()) { assoc.childDbSetName = (string)xAssoc.Attribute("childDbSetName"); } if (xAssoc.Attributes("childToParentName").Any()) { assoc.childToParentName = (string)xAssoc.Attribute("childToParentName"); } if (xAssoc.Attributes("parentToChildrenName").Any()) { assoc.parentToChildrenName = (string)xAssoc.Attribute("parentToChildrenName"); } if (xAssoc.Attributes("onDeleteAction").Any()) { assoc.onDeleteAction = (DeleteAction)Enum.Parse(typeof(DeleteAction), xAssoc.Attribute("onDeleteAction").Value); } XElement xFieldRels = xAssoc.Element(NS_DATA + "Association.fieldRels"); if (xFieldRels != null) { foreach (XElement xFieldRel in xFieldRels.Elements(NS_DATA + "FieldRel")) { FieldRel fldRel = new FieldRel { parentField = (string)xFieldRel.Attribute("parentField"), childField = (string)xFieldRel.Attribute("childField") }; assoc.fieldRels.Add(fldRel); } } metadata.Associations.Add(assoc); } } return(metadata); }