public void BuildAssociation(EdmxModel edmxModel, ModelSchema modelSchema, CsdlAssociationModel association, MetaModelBuilder metaModelBuilder, ModelErrors errors) { foreach (var associationEnd in association.AssociationEnd) { if (associationEnd.TypeModel is null) { if (!(associationEnd.TypeName is null)) { errors.AddErrorOrThrow($"{associationEnd.TypeName} not found.", $"{association.FullName} - {associationEnd.FullName}"); } continue; } //associationEnd.GetMultiplicity() //var roleName = associationEnd.RoleName; //associationEnd.TypeModel } var lstOneOptional = association.AssociationEnd.Where(end => end.GetMultiplicity() == MultiplicityKind.OneOptional).ToList(); var lstOne = association.AssociationEnd.Where(end => end.GetMultiplicity() == MultiplicityKind.One).ToList(); var lstMultiple = association.AssociationEnd.Where(end => end.GetMultiplicity() == MultiplicityKind.Multiple).ToList(); if ((lstOneOptional.Count == 1) && (lstMultiple.Count == 1)) { var masterEnd = lstOneOptional[0]; var foreignEnd = lstMultiple[0]; var lstMasterProperty = masterEnd.TypeModel.NavigationProperty.Where(np => np.FromRoleName == masterEnd.RoleName).ToList(); var lstForeignProperty = foreignEnd.TypeModel.NavigationProperty.Where(np => np.FromRoleName == foreignEnd.RoleName).ToList(); if ((lstMasterProperty.Count == 1) && (lstForeignProperty.Count == 1)) { //modelSchema.ComplexTypes.FindByKey2(lstMasterProperty[0]) //modelSchema.ComplexTypes.FindByKey2(lstMasterProperty[0].TypeModel.Nam) var result = metaModelBuilder.CreateModelRelation( association.Name, association.FullName, lstMasterProperty[0].ToRoleModel.TypeName, lstMasterProperty[0].Name, lstForeignProperty[0].ToRoleModel.TypeName, lstForeignProperty[0].Name ); modelSchema.Relations.Add(result); } } }
public void ReadCsdlAssociation(CsdlSchemaModel schemaModel, XElement eleAssociation, EdmConstants.CSDLConstants csdlConstants, ModelErrors errors) { var association = new CsdlAssociationModel(); if (eleAssociation.HasAttributes) { foreach (var attr in eleAssociation.Attributes()) { if (attr.IsNamespaceDeclaration) { // } else if (attr.Name == EdmConstants.AttrName) { association.Name = attr.Value; //} else if (attr.Name == csdlConstants.AttrIsDefaultEntityContainer) { // association.IsDefaultEntityContainer = ConvertToBoolean(attr.Value); } else if (CheckAndAddAnnotation(attr, association)) { } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, attr); } } } schemaModel.Association.Add(association); // children foreach (var ele2 in eleAssociation.Elements()) { if (ele2.Name == csdlConstants.End) { var associationEnd = new CsdlAssociationEndModel(); if (ele2.HasAttributes) { foreach (var attr in ele2.Attributes()) { if (attr.IsNamespaceDeclaration) { // } else if (attr.Name == EdmConstants.AttrRole) { associationEnd.RoleName = attr.Value; //} else if (attr.Name == EdmConstants.AttrEntitySet) { // associationEnd.EntitySetName = attr.Value; } else if (attr.Name == EdmConstants.AttrType) { associationEnd.TypeName = attr.Value; } else if (attr.Name == EdmConstants.AttrMultiplicity) { associationEnd.Multiplicity = attr.Value; } else if (CheckAndAddAnnotation(attr, associationEnd)) { } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, attr); } } } association.AssociationEnd.Add(associationEnd); foreach (var ele3 in ele2.Elements()) { { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3); } } } else if (ele2.Name == csdlConstants.ReferentialConstraint) { var referentialConstraint = new CsdlReferentialConstraintV3Model(); if (ele2.HasAttributes) { foreach (var attr in ele2.Attributes()) { if (attr.IsNamespaceDeclaration) { // } else if (CheckAndAddAnnotation(attr, referentialConstraint)) { } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, attr); } } } foreach (var ele3 in ele2.Elements()) { var isPrincipal = (ele3.Name == csdlConstants.Principal); var isDependent = (ele3.Name == csdlConstants.Dependent); if (isPrincipal || isDependent) { var referentialConstraintPartner = new CsdlReferentialConstraintPartnerV3Model(); if (ele3.HasAttributes) { foreach (var attr in ele3.Attributes()) { if (attr.Name == EdmConstants.AttrRole) { referentialConstraintPartner.RoleName = attr.Value; } else if (CheckAndAddAnnotation(attr, referentialConstraintPartner)) { } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3, attr); } } } foreach (var ele4 in ele3.Elements()) { if (ele4.Name == csdlConstants.PropertyRef) { var propertyRef = new CsdlPropertyRefModel(); if (ele4.HasAttributes) { foreach (var attr in ele4.Attributes()) { if (attr.Name == EdmConstants.AttrName) { propertyRef.PropertyName = attr.Value; } else if (CheckAndAddAnnotation(attr, propertyRef)) { } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3, ele4, attr); } } } foreach (var ele5 in ele4.Elements()) { { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3, ele4, ele5); } } referentialConstraintPartner.PropertyRef.Add(propertyRef); } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3, ele4); } } if (isPrincipal) { referentialConstraint.Principal = referentialConstraintPartner; } else if (isDependent) { referentialConstraint.Dependent = referentialConstraintPartner; } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3); } } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2, ele3); } } association.ReferentialConstraint.Add(referentialConstraint); } else { errors.AddErrorXmlParsing("ReadCSDLDocument", null, eleAssociation, ele2); } } }