Ejemplo n.º 1
0
        private void PairUpNavigationProperty(MetadataProviderEdmEntityContainer entityContainer, ResourceSetWrapper resourceSet, ResourceType resourceType, ResourceProperty navigationProperty)
        {
            string key = string.Concat(new object[] { resourceSet.Name, '_', resourceType.FullName, '_', navigationProperty.Name });

            if (!this.associationSetByKeyCache.ContainsKey(key))
            {
                ResourceAssociationSet resourceAssociationSet = this.MetadataProvider.GetResourceAssociationSet(resourceSet, resourceType, navigationProperty);
                if (resourceAssociationSet != null)
                {
                    string str2;
                    string str3;
                    ResourceAssociationSetEnd end = resourceAssociationSet.GetRelatedResourceAssociationSetEnd(resourceSet, resourceType, navigationProperty);
                    if (end.ResourceProperty != null)
                    {
                        ResourceAssociationSet set2 = this.MetadataProvider.GetResourceAssociationSet(this.MetadataProvider.ValidateResourceSet(end.ResourceSet), end.ResourceType, end.ResourceProperty);
                        if ((set2 == null) || (resourceAssociationSet.Name != set2.Name))
                        {
                            throw new InvalidOperationException(System.Data.Services.Strings.ResourceAssociationSet_BidirectionalAssociationMustReturnSameResourceAssociationSetFromBothEnd);
                        }
                    }
                    if (end.ResourceProperty != null)
                    {
                        str2 = string.Concat(new object[] { end.ResourceSet.Name, '_', end.ResourceType.FullName, '_', end.ResourceProperty.Name });
                    }
                    else
                    {
                        str2 = string.Concat(new object[] { end.ResourceSet.Name, "_Null_", resourceType.FullName, '_', navigationProperty.Name });
                    }
                    if (this.associationSetByKeyCache.TryGetValue(str2, out str3))
                    {
                        throw new InvalidOperationException(System.Data.Services.Strings.ResourceAssociationSet_MultipleAssociationSetsForTheSameAssociationTypeMustNotReferToSameEndSets(str3, resourceAssociationSet.Name, end.ResourceSet.Name));
                    }
                    ResourceAssociationType resourceAssociationType = resourceAssociationSet.ResourceAssociationType;
                    this.PairUpNavigationPropertyWithResourceAssociationSet(entityContainer, resourceAssociationSet, resourceAssociationType, resourceType, navigationProperty);
                    this.associationSetByKeyCache.Add(str2, resourceAssociationSet.Name);
                    this.associationSetByKeyCache.Add(key, resourceAssociationSet.Name);
                }
            }
        }
Ejemplo n.º 2
0
 private void PairUpNavigationPropertyWithResourceAssociationSet(MetadataProviderEdmEntityContainer entityContainer, ResourceAssociationSet resourceAssociationSet, ResourceAssociationType resourceAssociationType, ResourceType resourceType, ResourceProperty navigationProperty)
 {
     string associationEndName;
     EdmMultiplicity multiplicity;
     EdmOnDeleteAction deleteBehavior;
     string str3;
     EdmMultiplicity multiplicity2;
     EdmOnDeleteAction none;
     string typeNamespace;
     bool flag = (resourceAssociationSet.End1.ResourceProperty != null) && (resourceAssociationSet.End2.ResourceProperty != null);
     string entitySetName = MetadataProviderUtils.GetEntitySetName(resourceAssociationSet.End1.ResourceSet);
     string name = MetadataProviderUtils.GetEntitySetName(resourceAssociationSet.End2.ResourceSet);
     bool isPrinciple = false;
     List<IEdmStructuralProperty> dependentProperties = null;
     if (resourceAssociationType != null)
     {
         associationEndName = resourceAssociationType.End1.Name;
         deleteBehavior = resourceAssociationType.End1.DeleteBehavior;
         multiplicity2 = MetadataProviderUtils.ConvertMultiplicity(resourceAssociationType.End1.Multiplicity);
         str3 = resourceAssociationType.End2.Name;
         none = resourceAssociationType.End2.DeleteBehavior;
         multiplicity = MetadataProviderUtils.ConvertMultiplicity(resourceAssociationType.End2.Multiplicity);
         ResourceReferentialConstraint referentialConstraint = resourceAssociationType.ReferentialConstraint;
         if (referentialConstraint != null)
         {
             isPrinciple = object.ReferenceEquals(resourceAssociationType.End1, referentialConstraint.PrincipalEnd);
             IEdmEntityType type = isPrinciple ? ((IEdmEntityType) this.EnsureSchemaType(resourceAssociationSet.End2.ResourceType)) : ((IEdmEntityType) this.EnsureSchemaType(resourceAssociationSet.End1.ResourceType));
             dependentProperties = new List<IEdmStructuralProperty>();
             foreach (ResourceProperty property in referentialConstraint.DependentProperties)
             {
                 IEdmProperty property2 = type.FindProperty(property.Name);
                 dependentProperties.Add((IEdmStructuralProperty) property2);
             }
         }
     }
     else
     {
         if (!flag)
         {
             if (resourceAssociationSet.End1.ResourceProperty != null)
             {
                 associationEndName = resourceType.Name;
                 str3 = navigationProperty.Name;
             }
             else
             {
                 associationEndName = navigationProperty.Name;
                 str3 = resourceType.Name;
             }
         }
         else
         {
             associationEndName = MetadataProviderUtils.GetAssociationEndName(resourceAssociationSet.End1.ResourceType, resourceAssociationSet.End1.ResourceProperty);
             str3 = MetadataProviderUtils.GetAssociationEndName(resourceAssociationSet.End2.ResourceType, resourceAssociationSet.End2.ResourceProperty);
         }
         multiplicity = MetadataProviderUtils.GetMultiplicity(resourceAssociationSet.End1.ResourceProperty);
         deleteBehavior = EdmOnDeleteAction.None;
         multiplicity2 = MetadataProviderUtils.GetMultiplicity(resourceAssociationSet.End2.ResourceProperty);
         none = EdmOnDeleteAction.None;
     }
     string associationName = (resourceAssociationType == null) ? MetadataProviderUtils.GetAssociationName(resourceAssociationSet) : resourceAssociationType.Name;
     if ((resourceAssociationType == null) || (resourceAssociationType.NamespaceName == null))
     {
         ResourceAssociationSetEnd end = (resourceAssociationSet.End1.ResourceProperty != null) ? resourceAssociationSet.End1 : resourceAssociationSet.End2;
         typeNamespace = this.GetTypeNamespace(end.ResourceType);
     }
     else
     {
         typeNamespace = resourceAssociationType.NamespaceName;
     }
     ResourceProperty resourceProperty = resourceAssociationSet.End1.ResourceProperty;
     ResourceProperty property4 = resourceAssociationSet.End2.ResourceProperty;
     MetadataProviderEdmNavigationProperty partnerProperty = null;
     MetadataProviderEdmNavigationProperty property6 = null;
     if (resourceProperty != null)
     {
         IEdmEntityType type2 = (IEdmEntityType) this.EnsureSchemaType(resourceAssociationSet.End1.ResourceType);
         partnerProperty = (MetadataProviderEdmNavigationProperty) type2.FindProperty(resourceProperty.Name);
     }
     if (property4 != null)
     {
         IEdmEntityType type3 = (IEdmEntityType) this.EnsureSchemaType(resourceAssociationSet.End2.ResourceType);
         property6 = (MetadataProviderEdmNavigationProperty) type3.FindProperty(property4.Name);
     }
     IEdmNavigationProperty property7 = (partnerProperty != null) ? ((IEdmNavigationProperty) partnerProperty) : ((IEdmNavigationProperty) new MetadataProviderEdmSilentNavigationProperty(property6, deleteBehavior, multiplicity, associationEndName));
     IEdmNavigationProperty partner = (property6 != null) ? ((IEdmNavigationProperty) property6) : ((IEdmNavigationProperty) new MetadataProviderEdmSilentNavigationProperty(partnerProperty, none, multiplicity2, str3));
     MetadataProviderUtils.FixUpNavigationPropertyWithAssociationSetData(property7, partner, isPrinciple, dependentProperties, deleteBehavior, multiplicity);
     MetadataProviderUtils.FixUpNavigationPropertyWithAssociationSetData(partner, property7, !isPrinciple, dependentProperties, none, multiplicity2);
     EdmEntitySet entitySet = (EdmEntitySet) entityContainer.FindEntitySet(entitySetName);
     EdmEntitySet target = (EdmEntitySet) entityContainer.FindEntitySet(name);
     if (partnerProperty != null)
     {
         entitySet.AddNavigationTarget(partnerProperty, target);
         this.SetAssociationSetName(entitySet, partnerProperty, resourceAssociationSet.Name);
         this.SetAssociationSetAnnotations(entitySet, partnerProperty, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End2.CustomAnnotations));
     }
     if (property6 != null)
     {
         target.AddNavigationTarget(property6, entitySet);
         this.SetAssociationSetName(target, property6, resourceAssociationSet.Name);
         if (partnerProperty == null)
         {
             this.SetAssociationSetAnnotations(entitySet, property6, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End2.CustomAnnotations));
         }
     }
     this.SetAssociationNamespace(property7, typeNamespace);
     this.SetAssociationName(property7, associationName);
     this.SetAssociationEndName(property7, associationEndName);
     this.SetAssociationNamespace(partner, typeNamespace);
     this.SetAssociationName(partner, associationName);
     this.SetAssociationEndName(partner, str3);
     if (resourceAssociationType != null)
     {
         this.SetAssociationAnnotations(property7, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationType.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (property7.GetPrimary() == property7) ? resourceAssociationType.End1.CustomAnnotations : resourceAssociationType.End2.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (property7.GetPrimary() == property7) ? resourceAssociationType.End2.CustomAnnotations : resourceAssociationType.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (resourceAssociationType.ReferentialConstraint != null) ? resourceAssociationType.ReferentialConstraint.CustomAnnotations : null));
     }
 }
Ejemplo n.º 3
0
            /// <summary>
            /// Get the resource association type from the given resource association set and one of its ends
            /// </summary>
            /// <param name="associationSet">Association set to get the association type</param>
            /// <param name="resourceSet">Resource set for one of the ends</param>
            /// <param name="resourceType">Resource type for one of the ends</param>
            /// <param name="navigationProperty">Resource property for one of the ends</param>
            /// <returns>Resource association type instance</returns>
            private ResourceAssociationType GetResourceAssociationType(ResourceAssociationSet associationSet, ResourceSetWrapper resourceSet, ResourceType resourceType, ResourceProperty navigationProperty)
            {
                string typeNamespace = this.GetTypeNamepace(resourceType);
                Dictionary<string, ResourceAssociationType> associationTypesInNamespece = this.GetAssociationTypesForNamespace(typeNamespace);

                ResourceAssociationType associationType;
                string associationTypeName = GetAssociationTypeName(associationSet);
                string associationTypeLookupKey = GetAssociationTypeLookupName(resourceType, navigationProperty);
                if (!associationTypesInNamespece.TryGetValue(associationTypeLookupKey, out associationType))
                {
                    string end1Name;
                    string end2Name;

                    bool isBiDirectional = associationSet.End1.ResourceProperty != null && associationSet.End2.ResourceProperty != null;
                    if (!isBiDirectional)
                    {
                        // If this association is not bi-directional, we use the type name as the from role name and the property name as the to role name
                        // This is the behavior for V1.
                        if (associationSet.End1.ResourceProperty != null)
                        {
                            end1Name = resourceType.Name;
                            end2Name = navigationProperty.Name;
                        }
                        else
                        {
                            end1Name = navigationProperty.Name;
                            end2Name = resourceType.Name;
                        }
                    }
                    else
                    {
                        // If the association is bi-directional, we use typeName_propertyName from each end as the name for that role
                        end1Name = GetAssociationTypeLookupName(associationSet.End1.ResourceType, associationSet.End1.ResourceProperty);
                        end2Name = GetAssociationTypeLookupName(associationSet.End2.ResourceType, associationSet.End2.ResourceProperty);
                        Debug.Assert(end1Name != end2Name, "end1Name != end2Name");
                    }

                    associationType = new ResourceAssociationType(
                        associationTypeName,
                        resourceType.Namespace,
                        new ResourceAssociationTypeEnd(end1Name, associationSet.End1.ResourceType, associationSet.End1.ResourceProperty, associationSet.End2.ResourceProperty),
                        new ResourceAssociationTypeEnd(end2Name, associationSet.End2.ResourceType, associationSet.End2.ResourceProperty, associationSet.End1.ResourceProperty));

                    associationTypesInNamespece.Add(associationTypeLookupKey, associationType);
                    if (isBiDirectional)
                    {
                        ResourceAssociationSetEnd relatedEnd = associationSet.GetRelatedResourceAssociationSetEnd(resourceSet, resourceType, navigationProperty);
                        string relatedEndLookupKey = GetAssociationTypeLookupName(relatedEnd.ResourceType, relatedEnd.ResourceProperty);
                        associationTypesInNamespece.Add(relatedEndLookupKey, associationType);
                    }
                }

                return associationType;
            }
Ejemplo n.º 4
0
        private void PairUpNavigationPropertyWithResourceAssociationSet(MetadataProviderEdmEntityContainer entityContainer, ResourceAssociationSet resourceAssociationSet, ResourceAssociationType resourceAssociationType, ResourceType resourceType, ResourceProperty navigationProperty)
        {
            string            associationEndName;
            EdmMultiplicity   multiplicity;
            EdmOnDeleteAction deleteBehavior;
            string            str3;
            EdmMultiplicity   multiplicity2;
            EdmOnDeleteAction none;
            string            typeNamespace;
            bool   flag          = (resourceAssociationSet.End1.ResourceProperty != null) && (resourceAssociationSet.End2.ResourceProperty != null);
            string entitySetName = MetadataProviderUtils.GetEntitySetName(resourceAssociationSet.End1.ResourceSet);
            string name          = MetadataProviderUtils.GetEntitySetName(resourceAssociationSet.End2.ResourceSet);
            bool   isPrinciple   = false;
            List <IEdmStructuralProperty> dependentProperties = null;

            if (resourceAssociationType != null)
            {
                associationEndName = resourceAssociationType.End1.Name;
                deleteBehavior     = resourceAssociationType.End1.DeleteBehavior;
                multiplicity2      = MetadataProviderUtils.ConvertMultiplicity(resourceAssociationType.End1.Multiplicity);
                str3         = resourceAssociationType.End2.Name;
                none         = resourceAssociationType.End2.DeleteBehavior;
                multiplicity = MetadataProviderUtils.ConvertMultiplicity(resourceAssociationType.End2.Multiplicity);
                ResourceReferentialConstraint referentialConstraint = resourceAssociationType.ReferentialConstraint;
                if (referentialConstraint != null)
                {
                    isPrinciple = object.ReferenceEquals(resourceAssociationType.End1, referentialConstraint.PrincipalEnd);
                    IEdmEntityType type = isPrinciple ? ((IEdmEntityType)this.EnsureSchemaType(resourceAssociationSet.End2.ResourceType)) : ((IEdmEntityType)this.EnsureSchemaType(resourceAssociationSet.End1.ResourceType));
                    dependentProperties = new List <IEdmStructuralProperty>();
                    foreach (ResourceProperty property in referentialConstraint.DependentProperties)
                    {
                        IEdmProperty property2 = type.FindProperty(property.Name);
                        dependentProperties.Add((IEdmStructuralProperty)property2);
                    }
                }
            }
            else
            {
                if (!flag)
                {
                    if (resourceAssociationSet.End1.ResourceProperty != null)
                    {
                        associationEndName = resourceType.Name;
                        str3 = navigationProperty.Name;
                    }
                    else
                    {
                        associationEndName = navigationProperty.Name;
                        str3 = resourceType.Name;
                    }
                }
                else
                {
                    associationEndName = MetadataProviderUtils.GetAssociationEndName(resourceAssociationSet.End1.ResourceType, resourceAssociationSet.End1.ResourceProperty);
                    str3 = MetadataProviderUtils.GetAssociationEndName(resourceAssociationSet.End2.ResourceType, resourceAssociationSet.End2.ResourceProperty);
                }
                multiplicity   = MetadataProviderUtils.GetMultiplicity(resourceAssociationSet.End1.ResourceProperty);
                deleteBehavior = EdmOnDeleteAction.None;
                multiplicity2  = MetadataProviderUtils.GetMultiplicity(resourceAssociationSet.End2.ResourceProperty);
                none           = EdmOnDeleteAction.None;
            }
            string associationName = (resourceAssociationType == null) ? MetadataProviderUtils.GetAssociationName(resourceAssociationSet) : resourceAssociationType.Name;

            if ((resourceAssociationType == null) || (resourceAssociationType.NamespaceName == null))
            {
                ResourceAssociationSetEnd end = (resourceAssociationSet.End1.ResourceProperty != null) ? resourceAssociationSet.End1 : resourceAssociationSet.End2;
                typeNamespace = this.GetTypeNamespace(end.ResourceType);
            }
            else
            {
                typeNamespace = resourceAssociationType.NamespaceName;
            }
            ResourceProperty resourceProperty = resourceAssociationSet.End1.ResourceProperty;
            ResourceProperty property4        = resourceAssociationSet.End2.ResourceProperty;
            MetadataProviderEdmNavigationProperty partnerProperty = null;
            MetadataProviderEdmNavigationProperty property6       = null;

            if (resourceProperty != null)
            {
                IEdmEntityType type2 = (IEdmEntityType)this.EnsureSchemaType(resourceAssociationSet.End1.ResourceType);
                partnerProperty = (MetadataProviderEdmNavigationProperty)type2.FindProperty(resourceProperty.Name);
            }
            if (property4 != null)
            {
                IEdmEntityType type3 = (IEdmEntityType)this.EnsureSchemaType(resourceAssociationSet.End2.ResourceType);
                property6 = (MetadataProviderEdmNavigationProperty)type3.FindProperty(property4.Name);
            }
            IEdmNavigationProperty property7 = (partnerProperty != null) ? ((IEdmNavigationProperty)partnerProperty) : ((IEdmNavigationProperty) new MetadataProviderEdmSilentNavigationProperty(property6, deleteBehavior, multiplicity, associationEndName));
            IEdmNavigationProperty partner   = (property6 != null) ? ((IEdmNavigationProperty)property6) : ((IEdmNavigationProperty) new MetadataProviderEdmSilentNavigationProperty(partnerProperty, none, multiplicity2, str3));

            MetadataProviderUtils.FixUpNavigationPropertyWithAssociationSetData(property7, partner, isPrinciple, dependentProperties, deleteBehavior, multiplicity);
            MetadataProviderUtils.FixUpNavigationPropertyWithAssociationSetData(partner, property7, !isPrinciple, dependentProperties, none, multiplicity2);
            EdmEntitySet entitySet = (EdmEntitySet)entityContainer.FindEntitySet(entitySetName);
            EdmEntitySet target    = (EdmEntitySet)entityContainer.FindEntitySet(name);

            if (partnerProperty != null)
            {
                entitySet.AddNavigationTarget(partnerProperty, target);
                this.SetAssociationSetName(entitySet, partnerProperty, resourceAssociationSet.Name);
                this.SetAssociationSetAnnotations(entitySet, partnerProperty, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End2.CustomAnnotations));
            }
            if (property6 != null)
            {
                target.AddNavigationTarget(property6, entitySet);
                this.SetAssociationSetName(target, property6, resourceAssociationSet.Name);
                if (partnerProperty == null)
                {
                    this.SetAssociationSetAnnotations(entitySet, property6, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationSet.End2.CustomAnnotations));
                }
            }
            this.SetAssociationNamespace(property7, typeNamespace);
            this.SetAssociationName(property7, associationName);
            this.SetAssociationEndName(property7, associationEndName);
            this.SetAssociationNamespace(partner, typeNamespace);
            this.SetAssociationName(partner, associationName);
            this.SetAssociationEndName(partner, str3);
            if (resourceAssociationType != null)
            {
                this.SetAssociationAnnotations(property7, MetadataProviderUtils.ConvertCustomAnnotations(this, resourceAssociationType.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (property7.GetPrimary() == property7) ? resourceAssociationType.End1.CustomAnnotations : resourceAssociationType.End2.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (property7.GetPrimary() == property7) ? resourceAssociationType.End2.CustomAnnotations : resourceAssociationType.End1.CustomAnnotations), MetadataProviderUtils.ConvertCustomAnnotations(this, (resourceAssociationType.ReferentialConstraint != null) ? resourceAssociationType.ReferentialConstraint.CustomAnnotations : null));
            }
        }