private EntityType ParseEntityType(EdmXNames edm, XElement entityTypeEl) { var propertyEls = entityTypeEl.Elements(edm.Property); var entityProperties = new List <EntityProperty>(); foreach (var el in propertyEls) { var name = el.Attribute("Name").Value; var type = el.Attribute("Type").Value; var nullable = bool.Parse(el.Attribute("Nullable")?.Value ?? "true"); var targetPath = el.Attribute(_xnameTargetPath)?.Value; var contentKind = el.Attribute(_xnameContentKind)?.Value; var keepInContent = bool.Parse(el.Attribute(_xnameKeepInContent)?.Value ?? "true"); entityProperties.Add(new EntityProperty { Name = name, Type = type, Nullable = nullable, TargetPath = targetPath, ContentKind = contentKind, KeepInContent = keepInContent, }); } return(new EntityType { Properties = entityProperties, }); }
public async Task <Metadata> ParseMetadataAsync(Stream stream) { var doc = await ParseXmlAsync(stream); ValidateRootElement(doc, _xnameEdmx); var dataServices = doc.Root.Element(_xnameDataServices); // Discover EDM version. var edmNs = dataServices .Elements() .Where(x => x.Name.LocalName == EdmXNames.Edm200604.Schema.LocalName) .Select(x => x.Name.NamespaceName) .First(); var edm = EdmXNames.GetInstance(edmNs); var packagesEntitySet = dataServices .Elements(edm.Schema) .SelectMany(x => x.Elements(edm.EntityContainer)) .SelectMany(x => x.Elements(edm.EntitySet)) .First(x => x.Attribute("Name").Value == "Packages"); var packagesEntityType = packagesEntitySet.Attribute("EntityType").Value; var metadata = new Metadata(); foreach (var schemaEl in dataServices.Elements(edm.Schema)) { var schemaNamespace = schemaEl.Attribute("Namespace").Value; foreach (var entityTypeEl in schemaEl.Elements(edm.EntityType)) { var entityName = entityTypeEl.Attribute("Name").Value; var entityType = $"{schemaNamespace}.{entityName}"; if (entityType == packagesEntityType) { metadata.PackageEntityType = ParseEntityType(edm, entityTypeEl); } } } return(metadata); }