private void GenerateAssociation(DesignTimeMetadata metadata, IEntityType entityInfo, DbSetInfo dbSetInfo, INavigation childToParentNav) { INavigation inverseNavigation = childToParentNav.Inverse; //.FindInverse(); string assoc_name = string.Format("{0}_{1}", inverseNavigation.Name, childToParentNav.Name); // Console.WriteLine($"Generate association: {assoc_name}"); Association assoc = metadata.Associations.Where(a => a.name == assoc_name).FirstOrDefault(); if (assoc == null) { IProperty[] principalProps = inverseNavigation.ForeignKey.PrincipalKey.Properties.ToArray(); IProperty[] childProps = childToParentNav.ForeignKey.Properties.ToArray(); assoc = new Association { name = assoc_name }; IEntityType parentEntity = inverseNavigation.DeclaringEntityType; IEntityType childEntity = childToParentNav.DeclaringEntityType; assoc.parentDbSetName = parentEntity.ClrType.Name; assoc.childDbSetName = childEntity.ClrType.Name; assoc.childToParentName = childToParentNav.Name; if (inverseNavigation != null) { assoc.parentToChildrenName = inverseNavigation.Name; } int i = 0; foreach (IProperty pkProp in principalProps) { FieldRel frel = new FieldRel { childField = childProps?[i]?.Name, parentField = pkProp.Name }; assoc.fieldRels.Add(frel); ++i; } metadata.Associations.Add(assoc); } }
protected override Metadata GetMetadata(bool isDraft) { Metadata metadata = new Metadata(); var container = this.DB.MetadataWorkspace.GetEntityContainer(this.DB.DefaultContainerName, DataSpace.CSpace); var entitySetsDic = (from meta in container.BaseEntitySets where meta.BuiltInTypeKind == BuiltInTypeKind.EntitySet select new { EntitySetName = meta.Name, EntityTypeName = meta.ElementType.Name }).ToDictionary(es => es.EntityTypeName); var CSpace = this.DB.MetadataWorkspace.GetItemCollection(System.Data.Metadata.Edm.DataSpace.CSpace); var SSpace = this.DB.MetadataWorkspace.GetItemCollection(System.Data.Metadata.Edm.DataSpace.SSpace); var entityEdmTypes = CSpace.GetItems <EntityType>().OrderBy(e => e.Name).ToArray(); //var dbEntityEdmTypes = SSpace.GetItems<EntityType>().ToDictionary(r => r.Name); Array.ForEach(entityEdmTypes, (entityEdmType) => { if (entityEdmType.Abstract) { return; } string entityTypeName = entityEdmType.Name; string name = entityTypeName; if (entityEdmType.BaseType != null) { name = entityEdmType.BaseType.Name; } string entitySetName = entitySetsDic[name].EntitySetName; var keys = entityEdmType.KeyMembers.Select(k => k.Name).ToArray(); //string dbTableName = this.GetMappedEntitySetName(entitySetName); //var dbEntityEdm = dbEntityEdmTypes[dbTableName]; //Type entityType = this.GetEntityType(entitySetName); Type entityType = this.GetEntityType2(entityTypeName); DbSetInfo dbSetInfo = new DbSetInfo() { dbSetName = entityTypeName, EntityType = entityType }; metadata.DbSets.Add(dbSetInfo); var edmProps = entityEdmType.Properties.ToArray(); short pkNum = 0; Array.ForEach(edmProps, (edmProp) => { Field fieldInfo = new Field() { fieldName = edmProp.Name }; if (keys.Contains(fieldInfo.fieldName)) { ++pkNum; fieldInfo.isPrimaryKey = pkNum; fieldInfo.isReadOnly = true; } bool isComputed = this.isComputed(edmProp); fieldInfo.isAutoGenerated = this.isAutoGenerated(edmProp); fieldInfo.isNullable = edmProp.Nullable; fieldInfo.isReadOnly = fieldInfo.isAutoGenerated; bool isArray = false; string propType = edmProp.TypeUsage.EdmType.Name; fieldInfo.dataType = this.DataTypeFromType(propType, out isArray); var facets = edmProp.TypeUsage.Facets; var maxLenFacet = facets.Where(f => f.Name == "MaxLength").FirstOrDefault(); if (maxLenFacet != null) { try { fieldInfo.maxLength = (short)Convert.ChangeType(maxLenFacet.Value, typeof(short)); } catch { } } //gess that the property is rowversion fieldInfo.fieldType = (isComputed && fieldInfo.dataType == DataType.Binary) ? FieldType.RowTimeStamp : FieldType.None; dbSetInfo.fieldInfos.Add(fieldInfo); }); }); var associations = CSpace.GetItems <AssociationType>().Where(a => a.IsForeignKey).OrderBy(e => e.Name); Func <EdmType, string> fn_name = (EdmType n) => { if (n.FullName.Contains('[')) { Regex regex = new Regex(".*?\\[(.*?)\\].*?"); Match match = regex.Match(n.FullName); string table = match.Groups[1].Value; return(table); } else { return(n.FullName); } }; foreach (AssociationType asstype in associations) { var endMembers = asstype.RelationshipEndMembers; foreach (ReferentialConstraint constraint in asstype.ReferentialConstraints) { try { Association ass = metadata.Associations.Where(a => a.name == constraint.ToString()).FirstOrDefault(); if (ass == null) { var parentEnd = (constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.One || constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) ? constraint.FromRole : constraint.ToRole; var childEnd = constraint.FromRole == parentEnd ? constraint.ToRole : constraint.FromRole; var parent = parentEnd.TypeUsage.EdmType; var child = childEnd.TypeUsage.EdmType; string parentName = fn_name(parent); string childName = fn_name(child); var parentEntity = entityEdmTypes.Where(en => parentName == en.FullName).First(); var childEntity = entityEdmTypes.Where(en => childName == en.FullName).First(); var parentToChildren = parentEntity.NavigationProperties.Where(np => np.FromEndMember.Name == parentEnd.Name && np.ToEndMember.Name == childEnd.Name).FirstOrDefault(); var childToParent = childEntity.NavigationProperties.Where(np => np.FromEndMember.Name == childEnd.Name && np.ToEndMember.Name == parentEnd.Name).FirstOrDefault(); ass = new Association(); ass.name = constraint.ToString(); metadata.Associations.Add(ass); ass.parentDbSetName = parentEntity.Name; ass.childDbSetName = childEntity.Name; ass.parentToChildrenName = parentToChildren == null ? "" : parentToChildren.Name; ass.childToParentName = childToParent == null ? "" : childToParent.Name; var parentArr = constraint.FromRole == parentEnd?constraint.FromProperties.ToArray() : constraint.ToProperties.ToArray(); var childArr = constraint.FromRole == parentEnd?constraint.ToProperties.ToArray() : constraint.FromProperties.ToArray(); for (int i = 0; i < parentArr.Length; ++i) { FieldRel frel = null; frel = ass.fieldRels.Where(fr => fr.parentField == parentArr[i].Name && fr.childField == childArr[i].Name).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); frel.parentField = parentArr[i].Name; frel.childField = childArr[i].Name; } } } } catch (Exception) { throw; } } } return(metadata); }
protected override Metadata GetMetadata(bool isDraft) { Metadata metadata = new Metadata(); var container = this.ObjectContext.MetadataWorkspace.GetEntityContainer(this.ObjectContext.DefaultContainerName, DataSpace.CSpace); var entitySetsDic = (from meta in container.BaseEntitySets where meta.BuiltInTypeKind == BuiltInTypeKind.EntitySet select new { EntitySetName = meta.Name, EntityTypeName = meta.ElementType.Name }).ToDictionary(es => es.EntityTypeName); var CSpace = this.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSpace); var SSpace = this.ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.SSpace); var entityEdmTypes = CSpace.GetItems <EntityType>().OrderBy(e => e.Name).ToArray(); var complexEdmTypes = CSpace.GetItems <ComplexType>().OrderBy(e => e.Name).ToArray(); Array.ForEach(complexEdmTypes, (entityEdmType) => { string entityTypeName = entityEdmType.Name; string name = entityTypeName; var keys = entityEdmType.Members.Select(m => m.Name).Take(1).ToArray(); Type entityType = this.GetEntityType2(entityTypeName); DbSetInfo dbSetInfo = new DbSetInfo() { dbSetName = entityTypeName, EntityType = entityType }; metadata.DbSets.Add(dbSetInfo); var edmProps = entityEdmType.Properties.ToArray(); this.GenerateFieldInfos(dbSetInfo, keys, edmProps); }); Array.ForEach(entityEdmTypes, (entityEdmType) => { if (entityEdmType.Abstract) { return; } string entityTypeName = entityEdmType.Name; string name = entityTypeName; if (entityEdmType.BaseType != null) { name = entityEdmType.BaseType.Name; } var keys = entityEdmType.KeyMembers.Select(k => k.Name).ToArray(); //var dbEntityEdm = dbEntityEdmTypes[dbTableName]; //Type entityType = this.GetEntityType(entitySetName); //string entitySetName = entitySetsDic[name].EntitySetName; Type entityType = this.GetEntityType2(entityTypeName); DbSetInfo dbSetInfo = new DbSetInfo() { dbSetName = entityTypeName, EntityType = entityType }; metadata.DbSets.Add(dbSetInfo); var edmProps = entityEdmType.Properties.ToArray(); this.GenerateFieldInfos(dbSetInfo, keys, edmProps); }); var associations = CSpace.GetItems <AssociationType>().Where(a => a.IsForeignKey).OrderBy(e => e.Name); Func <EdmType, string> fn_name = (EdmType n) => { if (n.FullName.Contains('[')) { Regex regex = new Regex(".*?\\[(.*?)\\].*?"); Match match = regex.Match(n.FullName); string table = match.Groups[1].Value; return(table); } else { return(n.FullName); } }; foreach (AssociationType asstype in associations) { var endMembers = asstype.RelationshipEndMembers; foreach (ReferentialConstraint constraint in asstype.ReferentialConstraints) { try { Association ass = metadata.Associations.Where(a => a.name == constraint.ToString()).FirstOrDefault(); if (ass == null) { var parentEnd = (constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.One || constraint.FromRole.RelationshipMultiplicity == RelationshipMultiplicity.ZeroOrOne) ? constraint.FromRole : constraint.ToRole; var childEnd = constraint.FromRole == parentEnd ? constraint.ToRole : constraint.FromRole; var parent = parentEnd.TypeUsage.EdmType; var child = childEnd.TypeUsage.EdmType; string parentName = fn_name(parent); string childName = fn_name(child); var parentEntity = entityEdmTypes.Where(en => parentName == en.FullName).First(); var childEntity = entityEdmTypes.Where(en => childName == en.FullName).First(); var parentToChildren = parentEntity.NavigationProperties.Where(np => np.FromEndMember.Name == parentEnd.Name && np.ToEndMember.Name == childEnd.Name).FirstOrDefault(); var childToParent = childEntity.NavigationProperties.Where(np => np.FromEndMember.Name == childEnd.Name && np.ToEndMember.Name == parentEnd.Name).FirstOrDefault(); ass = new Association(); ass.name = constraint.ToString(); metadata.Associations.Add(ass); ass.parentDbSetName = parentEntity.Name; ass.childDbSetName = childEntity.Name; ass.parentToChildrenName = parentToChildren == null ? "" : parentToChildren.Name; ass.childToParentName = childToParent == null ? "" : childToParent.Name; var parentArr = constraint.FromRole == parentEnd?constraint.FromProperties.ToArray() : constraint.ToProperties.ToArray(); var childArr = constraint.FromRole == parentEnd?constraint.ToProperties.ToArray() : constraint.FromProperties.ToArray(); for (int i = 0; i < parentArr.Length; ++i) { FieldRel frel = null; frel = ass.fieldRels.Where(fr => fr.parentField == parentArr[i].Name && fr.childField == childArr[i].Name).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); frel.parentField = parentArr[i].Name; frel.childField = childArr[i].Name; } } } } catch (Exception) { throw; } } } return(metadata); }
protected override Metadata GetMetadata() { Metadata metadata = new Metadata(); PropertyInfo[] dbsetPropList = this.DB.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.Table <>)).ToArray(); Array.ForEach(dbsetPropList, (propInfo) => { Type entityType = propInfo.PropertyType.GetGenericArguments().First(); DbSetInfo dbSetInfo = new DbSetInfo() { dbSetName = entityType.Name, EntityType = entityType, insertDataMethod = "Insert{0}", updateDataMethod = "Update{0}", deleteDataMethod = "Delete{0}", refreshDataMethod = "", validateDataMethod = "" }; metadata.DbSets.Add(dbSetInfo); PropertyInfo[] fieldPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.ColumnAttribute), false)).ToArray(); short pkNum = 0; Array.ForEach(fieldPropList, (propInfo2) => { FieldInfo fieldInfo = new FieldInfo(); fieldInfo.fieldName = propInfo2.Name; var colAttr = (System.Data.Linq.Mapping.ColumnAttribute)propInfo2.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).First(); fieldInfo.isAutoGenerated = colAttr.IsDbGenerated; if (colAttr.IsPrimaryKey) { fieldInfo.isPrimaryKey = ++pkNum; } bool isArray = false; fieldInfo.dataType = this.DataHelper.DataTypeFromType(propInfo2.PropertyType, out isArray); fieldInfo.isNullable = this.DataHelper.IsNullableType(propInfo2.PropertyType) || colAttr.CanBeNull; fieldInfo.isRowTimeStamp = colAttr.IsVersion; fieldInfo.isReadOnly = !propInfo2.CanWrite; dbSetInfo.fieldInfos.Add(fieldInfo); }); PropertyInfo[] navPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.AssociationAttribute), false)).ToArray(); Array.ForEach(navPropList, (propInfo3) => { var attr = (System.Data.Linq.Mapping.AssociationAttribute)propInfo3.GetCustomAttributes(typeof(System.Data.Linq.Mapping.AssociationAttribute), false).First(); Association ass = metadata.Associations.Where(a => a.name == attr.Name).FirstOrDefault(); if (ass == null) { ass = new Association(); ass.name = attr.Name; metadata.Associations.Add(ass); } FieldRel frel; if (propInfo3.PropertyType.IsGenericType && propInfo3.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.EntitySet <>)) { frel = ass.fieldRels.Where(f => f.childField == attr.OtherKey && f.parentField == attr.ThisKey).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); } Type entityType3 = propInfo3.PropertyType.GetGenericArguments().First(); ass.childDbSetName = entityType3.Name; ass.parentToChildrenName = propInfo3.Name; frel.childField = attr.OtherKey; frel.parentField = attr.ThisKey; } else { frel = ass.fieldRels.Where(f => f.childField == attr.ThisKey && f.parentField == attr.OtherKey).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); } ass.parentDbSetName = propInfo3.PropertyType.Name; ass.childToParentName = propInfo3.Name; frel.childField = attr.ThisKey; frel.parentField = attr.OtherKey; } }); }); return(metadata); }
protected override Metadata GetMetadata(bool isDraft) { Metadata metadata = new Metadata(); PropertyInfo[] dbsetPropList = this.DB.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.Table <>)).ToArray(); Array.ForEach(dbsetPropList, (propInfo) => { Type entityType = propInfo.PropertyType.GetGenericArguments().First(); DbSetInfo dbSetInfo = new DbSetInfo() { dbSetName = entityType.Name, EntityType = entityType }; metadata.DbSets.Add(dbSetInfo); PropertyInfo[] fieldPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.ColumnAttribute), false)).ToArray(); short pkNum = 0; Array.ForEach(fieldPropList, (propInfo2) => { Field fieldInfo = new Field(); fieldInfo.fieldName = propInfo2.Name; var colAttr = (System.Data.Linq.Mapping.ColumnAttribute)propInfo2.GetCustomAttributes(typeof(System.Data.Linq.Mapping.ColumnAttribute), false).First(); fieldInfo.isAutoGenerated = colAttr.IsDbGenerated; if (colAttr.IsPrimaryKey) { fieldInfo.isPrimaryKey = ++pkNum; } if (!string.IsNullOrWhiteSpace(colAttr.DbType) && colAttr.DbType.IndexOf("Char(", StringComparison.OrdinalIgnoreCase) >= 0) { string len = System.Text.RegularExpressions.Regex.Match(colAttr.DbType, @"\(([^)]*)\)").Groups[1].Value; int maxLength = -1; if (int.TryParse(len, out maxLength)) { fieldInfo.maxLength = (short)maxLength; } } bool isArray = false; fieldInfo.dataType = this.ServiceContainer.ValueConverter.DataTypeFromType(propInfo2.PropertyType, out isArray); if (colAttr.DbType.IndexOf("NOT NULL", StringComparison.OrdinalIgnoreCase) > 0) { fieldInfo.isNullable = false; } fieldInfo.fieldType = colAttr.IsVersion?FieldType.RowTimeStamp: FieldType.None; fieldInfo.isReadOnly = !propInfo2.CanWrite; dbSetInfo.fieldInfos.Add(fieldInfo); }); PropertyInfo[] navPropList = entityType.GetProperties().Where(p => p.IsDefined(typeof(System.Data.Linq.Mapping.AssociationAttribute), false)).ToArray(); Array.ForEach(navPropList, (propInfo3) => { var attr = (System.Data.Linq.Mapping.AssociationAttribute)propInfo3.GetCustomAttributes(typeof(System.Data.Linq.Mapping.AssociationAttribute), false).First(); Association ass = metadata.Associations.Where(a => a.name == attr.Name).FirstOrDefault(); if (ass == null) { ass = new Association(); ass.name = attr.Name; metadata.Associations.Add(ass); } FieldRel frel; if (propInfo3.PropertyType.IsGenericType && propInfo3.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Linq.EntitySet <>)) { frel = ass.fieldRels.Where(f => f.childField == attr.OtherKey && f.parentField == attr.ThisKey).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); } Type entityType3 = propInfo3.PropertyType.GetGenericArguments().First(); ass.childDbSetName = entityType3.Name; ass.parentToChildrenName = propInfo3.Name; frel.childField = attr.OtherKey; frel.parentField = attr.ThisKey; } else { frel = ass.fieldRels.Where(f => f.childField == attr.ThisKey && f.parentField == attr.OtherKey).FirstOrDefault(); if (frel == null) { frel = new FieldRel(); ass.fieldRels.Add(frel); } ass.parentDbSetName = propInfo3.PropertyType.Name; ass.childToParentName = propInfo3.Name; frel.childField = attr.ThisKey; frel.parentField = attr.OtherKey; } }); }); return(metadata); }
protected override Metadata GetMetadata(bool isDraft) { var metadata = new Metadata(); var dbSetProps = typeof(TDB).GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) .Where( p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(DbSet <>)); var dbSetTypes = dbSetProps.Select(p => p.PropertyType.GetGenericArguments().First()).ToArray(); Array.ForEach(dbSetTypes, dbSetType => { var entityTypeName = dbSetType.Name; var name = entityTypeName; var fieldsProps = dbSetType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly) .Where( p => !(p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(ICollection <>))) .ToArray(); var keys = new string[0]; var keyProps = fieldsProps.Where(p => p.GetCustomAttributes <KeyAttribute>().Any()).ToArray(); if (keyProps.Length > 0) { var keyProps2 = fieldsProps.Where(p => p.GetCustomAttributes <KeyAttribute>().Any()) .Select( p => new { p.Name, corder = p.GetCustomAttributes <ColumnAttribute>().FirstOrDefault() }) .OrderBy(p => p.corder == null ? p.Name : p.corder.Order.ToString().PadLeft(4, '0')) .ToArray(); keys = keyProps2.Select(p => p.Name).ToArray(); } else { keyProps = fieldsProps.Where( p => p.Name.EndsWith("ID", StringComparison.OrdinalIgnoreCase) && !p.Name.EndsWith("guid", StringComparison.OrdinalIgnoreCase)).ToArray(); keys = keyProps.Select(p => p.Name).ToArray(); } var entityType = dbSetType; var dbSetInfo = new DbSetInfo { dbSetName = entityTypeName, EntityType = entityType }; metadata.DbSets.Add(dbSetInfo); GenerateFieldInfos(metadata, dbSetTypes, dbSetInfo, keys, fieldsProps); }); metadata.Associations.ForEach(assoc => { var parentDB = metadata.DbSets.Where(d => d.dbSetName == assoc.parentDbSetName).FirstOrDefault(); var childDB = metadata.DbSets.Where(d => d.dbSetName == assoc.childDbSetName).FirstOrDefault(); var pkFields = parentDB.GetPKFields(); foreach (var pkfield in pkFields) { var fld = childDB.fieldInfos.Where(f => f.fieldName == pkfield.fieldName && f.dataType == pkfield.dataType) .FirstOrDefault(); if (fld != null) { var frel = new FieldRel(); frel.childField = fld.fieldName; frel.parentField = pkfield.fieldName; assoc.fieldRels.Add(frel); } } }); return(metadata); }
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); }