Esempio n. 1
0
        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);
                }
            }
        }
Esempio n. 2
0
        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);
                }
            }
        }