示例#1
0
        /// <summary>Adds a new navigation property.</summary>
        /// <param name="entityType">The entity type to add the property to.</param>
        /// <param name="name">The name of the property to add.</param>
        /// <param name="deleteAction">The delete action of the nav property.</param>
        /// <param name="propertyTypeReference">The type of the property to add.</param>
        /// <param name="propertyInfo">If this is a CLR property, the <see cref="PropertyInfo"/> for the property, or null otherwise.</param>
        /// <param name="containsTarget">The contains target of the nav property</param>
        /// <returns>The newly created and added property.</returns>
        private IEdmNavigationProperty AddNavigationProperty(
            IEdmEntityType entityType,
            string name,
            EdmOnDeleteAction deleteAction,
            IEdmTypeReference propertyTypeReference,
            bool containsTarget)
        {
            // Create a navigation property representing one side of an association.
            // The partner representing the other side exists only inside this property and is not added to the target entity type,
            // so it should not cause any name collisions.
            EdmNavigationProperty navProperty = EdmNavigationProperty.CreateNavigationPropertyWithPartner(
                name,
                propertyTypeReference,
                /*dependentProperties*/ null,
                /*principalProperties*/ null,
                containsTarget,
                deleteAction,
                "Partner",
                entityType.ToTypeReference(true),
                /*partnerDependentProperties*/ null,
                /*partnerPrincipalProperties*/ null,
                /*partnerContainsTarget*/ false,
                EdmOnDeleteAction.None);

            ((EdmStructuredType)entityType).AddProperty(navProperty);

            return(navProperty);
        }
 internal ResourceAssociationTypeEnd(string name, System.Data.Services.Providers.ResourceType resourceType, System.Data.Services.Providers.ResourceProperty resourceProperty, string multiplicity, EdmOnDeleteAction deleteBehavior)
 {
     this.name = name;
     this.resourceType = resourceType;
     this.resourceProperty = resourceProperty;
     this.multiplicity = multiplicity;
     this.deleteAction = deleteBehavior;
 }
 internal ResourceAssociationTypeEnd(string name, System.Data.Services.Providers.ResourceType resourceType, System.Data.Services.Providers.ResourceProperty resourceProperty, string multiplicity, EdmOnDeleteAction deleteBehavior)
 {
     this.name             = name;
     this.resourceType     = resourceType;
     this.resourceProperty = resourceProperty;
     this.multiplicity     = multiplicity;
     this.deleteAction     = deleteBehavior;
 }
示例#4
0
        /// <summary>
        /// Creates two navigation properties representing an association between two entity types.
        /// </summary>
        /// <param name="propertyName">Navigation property name.</param>
        /// <param name="propertyType">Type of the navigation property.</param>
        /// <param name="dependentProperties">Dependent properties of the navigation source.</param>
        /// <param name="principalProperties">Principal properties of the navigation source.</param>
        /// <param name="containsTarget">A value indicating whether the navigation source logically contains the navigation target.</param>
        /// <param name="onDelete">Action to take upon deletion of an instance of the navigation source.</param>
        /// <param name="partnerPropertyName">Navigation partner property name.</param>
        /// <param name="partnerPropertyType">Type of the navigation partner property.</param>
        /// <param name="partnerDependentProperties">Dependent properties of the navigation target.</param>
        /// <param name="partnerPrincipalProperties">Principal properties of the navigation target.</param>
        /// <param name="partnerContainsTarget">A value indicating whether the navigation target logically contains the navigation source.</param>
        /// <param name="partnerOnDelete">Action to take upon deletion of an instance of the navigation target.</param>
        /// <returns>Navigation property.</returns>
        public static EdmNavigationProperty CreateNavigationPropertyWithPartner(
            string propertyName,
            IEdmTypeReference propertyType,
            IEnumerable <IEdmStructuralProperty> dependentProperties,
            IEnumerable <IEdmStructuralProperty> principalProperties,
            bool containsTarget,
            EdmOnDeleteAction onDelete,
            string partnerPropertyName,
            IEdmTypeReference partnerPropertyType,
            IEnumerable <IEdmStructuralProperty> partnerDependentProperties,
            IEnumerable <IEdmStructuralProperty> partnerPrincipalProperties,
            bool partnerContainsTarget,
            EdmOnDeleteAction partnerOnDelete)
        {
            EdmUtil.CheckArgumentNull(propertyName, "propertyName");
            EdmUtil.CheckArgumentNull(propertyType, "propertyType");
            EdmUtil.CheckArgumentNull(partnerPropertyName, "partnerPropertyName");
            EdmUtil.CheckArgumentNull(partnerPropertyType, "partnerPropertyType");

            IEdmEntityType declaringType = GetEntityType(partnerPropertyType);

            if (declaringType == null)
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "partnerPropertyType");
            }

            IEdmEntityType partnerDeclaringType = GetEntityType(propertyType);

            if (partnerDeclaringType == null)
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "propertyType");
            }

            EdmNavigationProperty end1 = new EdmNavigationProperty(
                declaringType,
                propertyName,
                propertyType,
                dependentProperties,
                principalProperties,
                containsTarget,
                onDelete);

            EdmNavigationProperty end2 = new EdmNavigationProperty(
                partnerDeclaringType,
                partnerPropertyName,
                partnerPropertyType,
                partnerDependentProperties,
                partnerPrincipalProperties,
                partnerContainsTarget,
                partnerOnDelete);

            end1.partner = end2;
            end2.partner = end1;
            return(end1);
        }
 /// <summary>
 /// Creates a new instance of EndInfo.
 /// </summary>
 /// <param name="name">name of the end.</param>
 /// <param name="resourceType">resource type that the end refers to.</param>
 /// <param name="resourceProperty">property of the end.</param>
 /// <param name="multiplicity">Multiplicity of the association.</param>
 /// <param name="deleteBehavior">Delete behavior.</param>
 internal ResourceAssociationTypeEnd(string name, ResourceType resourceType, ResourceProperty resourceProperty, string multiplicity, EdmOnDeleteAction deleteBehavior)
 {
     Debug.Assert(!String.IsNullOrEmpty(name), "!String.IsNullOrEmpty(name)");
     Debug.Assert(resourceType != null, "type != null");
     Debug.Assert(multiplicity == XmlConstants.Many || multiplicity == XmlConstants.One || multiplicity == XmlConstants.ZeroOrOne, "Invalid multiplicity value");
     Debug.Assert(deleteBehavior == EdmOnDeleteAction.None || deleteBehavior == EdmOnDeleteAction.Cascade, "Invalid deleteBehavior value");
     this.name = name;
     this.resourceType = resourceType;
     this.resourceProperty = resourceProperty;
     this.multiplicity = multiplicity;
     this.deleteAction = deleteBehavior;
 }
示例#6
0
 /// <summary>
 /// Creates a new instance of EndInfo.
 /// </summary>
 /// <param name="name">name of the end.</param>
 /// <param name="resourceType">resource type that the end refers to.</param>
 /// <param name="resourceProperty">property of the end.</param>
 /// <param name="multiplicity">Multiplicity of the association.</param>
 /// <param name="deleteBehavior">Delete behavior.</param>
 internal ResourceAssociationTypeEnd(string name, ResourceType resourceType, ResourceProperty resourceProperty, string multiplicity, EdmOnDeleteAction deleteBehavior)
 {
     Debug.Assert(!String.IsNullOrEmpty(name), "!String.IsNullOrEmpty(name)");
     Debug.Assert(resourceType != null, "type != null");
     Debug.Assert(multiplicity == XmlConstants.Many || multiplicity == XmlConstants.One || multiplicity == XmlConstants.ZeroOrOne, "Invalid multiplicity value");
     Debug.Assert(deleteBehavior == EdmOnDeleteAction.None || deleteBehavior == EdmOnDeleteAction.Cascade, "Invalid deleteBehavior value");
     this.name             = name;
     this.resourceType     = resourceType;
     this.resourceProperty = resourceProperty;
     this.multiplicity     = multiplicity;
     this.deleteAction     = deleteBehavior;
 }
 private EdmNavigationProperty(
     IEdmEntityType declaringType,
     string name,
     IEdmTypeReference type,
     IEnumerable<IEdmStructuralProperty> dependentProperties,
     bool containsTarget,
     EdmOnDeleteAction onDelete)
     : base(declaringType, name, type)
 {
     this.dependentProperties = dependentProperties;
     this.containsTarget = containsTarget;
     this.onDelete = onDelete;
 }
示例#8
0
 private EdmNavigationProperty(
     IEdmEntityType declaringType,
     string name,
     IEdmTypeReference type,
     IEnumerable <IEdmStructuralProperty> dependentProperties,
     bool containsTarget,
     EdmOnDeleteAction onDelete)
     : base(declaringType, name, type)
 {
     this.dependentProperties = dependentProperties;
     this.containsTarget      = containsTarget;
     this.onDelete            = onDelete;
 }
 /// <summary>
 /// Creates a new Silent partner for a navigation property
 /// </summary>
 /// <param name="partnerProperty">The navigation property this is a silent partner of.</param>
 /// <param name="propertyDeleteAction">The on delete action for this side of the association</param>
 /// <param name="multiplicity">The multiplicity of this side of the association.</param>
 /// <param name="name">The name of this navigation property.</param>
 public MetadataProviderEdmSilentNavigationProperty(IEdmNavigationProperty partnerProperty, EdmOnDeleteAction propertyDeleteAction, EdmMultiplicity multiplicity, string name)
 {
     this.partner = partnerProperty;
     this.deleteAction = propertyDeleteAction;
     this.name = name;
     switch (multiplicity)
     {
         case EdmMultiplicity.One:
             this.type = new EdmEntityTypeReference(this.partner.DeclaringEntityType(), false);
             break;
         case EdmMultiplicity.ZeroOrOne:
             this.type = new EdmEntityTypeReference(this.partner.DeclaringEntityType(), true);
             break;
         case EdmMultiplicity.Many:
             this.type = new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(this.partner.DeclaringEntityType(), false)));
             break;
     }
 }
示例#10
0
        private EdmNavigationProperty(
            IEdmEntityType declaringType,
            string name,
            IEdmTypeReference type,
            IEnumerable<IEdmStructuralProperty> dependentProperties,
            IEnumerable<IEdmStructuralProperty> principalProperties,
            bool containsTarget,
            EdmOnDeleteAction onDelete)
            : base(declaringType, name, type)
        {
            this.containsTarget = containsTarget;
            this.onDelete = onDelete;

            if (dependentProperties != null)
            {
                this.referentialConstraint = EdmReferentialConstraint.Create(dependentProperties, principalProperties);
            }
        }
示例#11
0
        private EdmNavigationProperty(
            IEdmEntityType declaringType,
            string name,
            IEdmTypeReference type,
            IEnumerable <IEdmStructuralProperty> dependentProperties,
            IEnumerable <IEdmStructuralProperty> principalProperties,
            bool containsTarget,
            EdmOnDeleteAction onDelete)
            : base(declaringType, name, type)
        {
            this.containsTarget = containsTarget;
            this.onDelete       = onDelete;

            if (dependentProperties != null)
            {
                this.referentialConstraint = EdmReferentialConstraint.Create(dependentProperties, principalProperties);
            }
        }
示例#12
0
        public MetadataProviderEdmSilentNavigationProperty(IEdmNavigationProperty partnerProperty, EdmOnDeleteAction propertyDeleteAction, EdmMultiplicity multiplicity, string name)
        {
            this.partner      = partnerProperty;
            this.deleteAction = propertyDeleteAction;
            this.name         = name;
            switch (multiplicity)
            {
            case EdmMultiplicity.ZeroOrOne:
                this.type = new EdmEntityTypeReference(this.partner.DeclaringEntityType(), true);
                return;

            case EdmMultiplicity.One:
                this.type = new EdmEntityTypeReference(this.partner.DeclaringEntityType(), false);
                return;

            case EdmMultiplicity.Many:
                this.type = new EdmCollectionTypeReference(new EdmCollectionType(new EdmEntityTypeReference(this.partner.DeclaringEntityType(), false)), false);
                return;
            }
        }
示例#13
0
        /// <summary>
        /// Compares two sets of navigation properties (expected value in CSDL, actual as IEdmStructuredType).
        /// </summary>
        /// <param name="navigationPropertyElements">The CSDL element representing the properties.</param>
        /// <param name="structuredType">The EDM model type to compare against.</param>
        private static void CompareNavigationProperties(IEnumerable <XElement> navigationPropertyElements, IEdmStructuredType structuredType)
        {
            string structuredTypeName   = structuredType.TestFullName();
            var    navigationProperties = structuredType.Properties().OfType <IEdmNavigationProperty>().ToArray();

            ExceptionUtilities.Assert(navigationPropertyElements.Count() == navigationProperties.Count(), "Unexpected number of navigation properties on type " + structuredTypeName);
            foreach (var navigationPropertyElement in navigationPropertyElements)
            {
                var propertyName       = navigationPropertyElement.GetAttributeValue("Name");
                var navigationProperty = navigationProperties.SingleOrDefault(np => np.Name == propertyName);
                ExceptionUtilities.Assert(navigationProperty != null, "Failed to find navigation property " + propertyName + " on type " + structuredTypeName);

                CompareType(navigationPropertyElement, navigationProperty.Type);

                // Compare NavigationProperty Partner, if present
                var partner = navigationPropertyElement.Attribute("Partner");
                if (partner == null)
                {
                    ExceptionUtilities.Assert(navigationProperty.Partner == null, "Did not expect a Partner value for navigation property " + propertyName + " on type " + structuredTypeName);
                }
                else
                {
                    ExceptionUtilities.Assert(navigationProperty.Partner != null, "Expected a Partner value for navigation property " + propertyName + " on type " + structuredTypeName);
                    ExceptionUtilities.Assert(partner.Value == navigationProperty.Partner.Name, "Unexpected value for navigation property partner");
                }

                // Compare any referential constraints
                var referentialConstraintElements = navigationPropertyElement.EdmElements("ReferentialConstraint").ToArray();
                if (referentialConstraintElements.Any())
                {
                    ExceptionUtilities.Assert(navigationProperty.ReferentialConstraint != null, "Expected a referential constraint to be present");
                    ExceptionUtilities.Assert(referentialConstraintElements.Count() == navigationProperty.ReferentialConstraint.PropertyPairs.Count(), "Unexpected number of referential constraint pairs");
                    foreach (var referentialConstraintElement in referentialConstraintElements)
                    {
                        var principalProperty  = referentialConstraintElement.GetAttributeValue("ReferencedProperty");
                        var referencedProperty = referentialConstraintElement.GetAttributeValue("Property");
                        var constraintPair     = navigationProperty.ReferentialConstraint.PropertyPairs
                                                 .SingleOrDefault(p => p.PrincipalProperty.Name == principalProperty && p.DependentProperty.Name == referencedProperty);

                        ExceptionUtilities.Assert(constraintPair != null, "Failed to find constraint pair (" + principalProperty + ", " + referencedProperty + ")");
                    }
                }
                else
                {
                    ExceptionUtilities.Assert(navigationProperty.ReferentialConstraint == null, "Did not expect any referential constraints");
                }

                // Compare OnDelete, if present
                var onDeleteElement = navigationPropertyElement.EdmElements("OnDelete").SingleOrDefault();
                if (onDeleteElement != null)
                {
                    EdmOnDeleteAction expectedAction;
                    EdmOnDeleteAction.TryParse(onDeleteElement.GetAttributeValue("Action"), out expectedAction);
                    ExceptionUtilities.Assert(expectedAction == navigationProperty.OnDelete, "Unexpected value for OnDelete");
                }
                else
                {
                    ExceptionUtilities.Assert(EdmOnDeleteAction.None == navigationProperty.OnDelete, "Unexpected value for OnDelete");
                }
            }
        }
示例#14
0
 public CsdlOnDelete(EdmOnDeleteAction action, CsdlDocumentation documentation, CsdlLocation location)
     : base(documentation, location)
 {
     this.action = action;
 }
 internal void FixUpNavigationProperty(IEdmNavigationProperty partnerProperty, bool isPrincipleEnd, EdmOnDeleteAction propertyDeleteAction)
 {
     this.partner = partnerProperty;
     this.isPrinciple = isPrincipleEnd;
     this.deleteAction = propertyDeleteAction;
 }
示例#16
0
 public CsdlOnDelete(EdmOnDeleteAction action, CsdlDocumentation documentation, CsdlLocation location)
     : base(documentation, location)
 {
     this.action = action;
 }
 internal void WriteOperationActionElement(string elementName, EdmOnDeleteAction operationAction)
 {
     this.xmlWriter.WriteStartElement(elementName);
     this.WriteRequiredAttribute(CsdlConstants.Attribute_Action, operationAction.ToString(), EdmValueWriter.StringAsXml);
     this.WriteEndElement();
 }
示例#18
0
 public CsdlOnDelete(EdmOnDeleteAction action, CsdlLocation location)
     : base(location)
 {
     this.action = action;
 }
        /// <summary>
        /// Creates two navigation properties representing an association between two entity types.
        /// </summary>
        /// <param name="propertyName">Navigation property name.</param>
        /// <param name="propertyType">Type of the navigation property.</param>
        /// <param name="dependentProperties">Dependent properties of the navigation source.</param>
        /// <param name="principalProperties">Principal properties of the navigation source.</param>
        /// <param name="containsTarget">A value indicating whether the navigation source logically contains the navigation target.</param>
        /// <param name="onDelete">Action to take upon deletion of an instance of the navigation source.</param>
        /// <param name="partnerPropertyName">Navigation partner property name.</param>
        /// <param name="partnerPropertyType">Type of the navigation partner property.</param>
        /// <param name="partnerDependentProperties">Dependent properties of the navigation target.</param>
        /// <param name="partnerPrincipalProperties">Principal properties of the navigation target.</param>
        /// <param name="partnerContainsTarget">A value indicating whether the navigation target logically contains the navigation source.</param>
        /// <param name="partnerOnDelete">Action to take upon deletion of an instance of the navigation target.</param>
        /// <returns>Navigation property.</returns>
        public static EdmNavigationProperty CreateNavigationPropertyWithPartner(
            string propertyName,
            IEdmTypeReference propertyType,
            IEnumerable <IEdmStructuralProperty> dependentProperties,
            IEnumerable <IEdmStructuralProperty> principalProperties,
            bool containsTarget,
            EdmOnDeleteAction onDelete,
            string partnerPropertyName,
            IEdmTypeReference partnerPropertyType,
            IEnumerable <IEdmStructuralProperty> partnerDependentProperties,
            IEnumerable <IEdmStructuralProperty> partnerPrincipalProperties,
            bool partnerContainsTarget,
            EdmOnDeleteAction partnerOnDelete)
        {
            EdmUtil.CheckArgumentNull(propertyName, "propertyName");
            EdmUtil.CheckArgumentNull(propertyType, "propertyType");
            EdmUtil.CheckArgumentNull(partnerPropertyName, "partnerPropertyName");
            EdmUtil.CheckArgumentNull(partnerPropertyType, "partnerPropertyType");
            IEdmStructuredType declaringType = null;

            if (partnerPropertyType.Definition.TypeKind == EdmTypeKind.Entity)
            {
                declaringType = GetEntityType(partnerPropertyType) as IEdmEntityType;
                if (declaringType == null)
                {
                    throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, nameof(partnerPropertyType));
                }
            }
            else if (partnerPropertyType.Definition.TypeKind == EdmTypeKind.Complex)
            {
                declaringType = GetComplexType(partnerPropertyType) as IEdmComplexType;
                if (declaringType == null)
                {
                    throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, nameof(partnerPropertyType));
                }
            }
            else
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, nameof(partnerPropertyType));
            }

            IEdmEntityType partnerDeclaringType = GetEntityType(propertyType);

            if (partnerDeclaringType == null)
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, nameof(propertyType));
            }

            EdmNavigationProperty end1 = new EdmNavigationProperty(
                declaringType,
                propertyName,
                propertyType,
                dependentProperties,
                principalProperties,
                containsTarget,
                onDelete);

            EdmNavigationProperty end2 = new EdmNavigationProperty(
                partnerDeclaringType,
                partnerPropertyName,
                partnerPropertyType,
                partnerDependentProperties,
                partnerPrincipalProperties,
                partnerContainsTarget,
                partnerOnDelete);

            end1.SetPartner(end2, new EdmPathExpression(end2.Name));
            end2.SetPartner(end1, new EdmPathExpression(end1.Name));
            return(end1);
        }
示例#20
0
        public static EdmNavigationProperty CreateNavigationPropertyWithPartner(string propertyName, IEdmTypeReference propertyType, IEnumerable <IEdmStructuralProperty> dependentProperties, bool containsTarget, EdmOnDeleteAction onDelete, string partnerPropertyName, IEdmTypeReference partnerPropertyType, IEnumerable <IEdmStructuralProperty> partnerDependentProperties, bool partnerContainsTarget, EdmOnDeleteAction partnerOnDelete)
        {
            EdmUtil.CheckArgumentNull <string>(propertyName, "propertyName");
            EdmUtil.CheckArgumentNull <IEdmTypeReference>(propertyType, "propertyType");
            EdmUtil.CheckArgumentNull <string>(partnerPropertyName, "partnerPropertyName");
            EdmUtil.CheckArgumentNull <IEdmTypeReference>(partnerPropertyType, "partnerPropertyType");
            IEdmEntityType entityType = EdmNavigationProperty.GetEntityType(partnerPropertyType);

            if (entityType != null)
            {
                IEdmEntityType edmEntityType = EdmNavigationProperty.GetEntityType(propertyType);
                if (edmEntityType != null)
                {
                    EdmNavigationProperty edmNavigationProperty  = new EdmNavigationProperty(entityType, propertyName, propertyType, dependentProperties, containsTarget, onDelete);
                    EdmNavigationProperty edmNavigationProperty1 = new EdmNavigationProperty(edmEntityType, partnerPropertyName, partnerPropertyType, partnerDependentProperties, partnerContainsTarget, partnerOnDelete);
                    edmNavigationProperty.partner  = edmNavigationProperty1;
                    edmNavigationProperty1.partner = edmNavigationProperty;
                    return(edmNavigationProperty);
                }
                else
                {
                    throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "propertyType");
                }
            }
            else
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "partnerPropertyType");
            }
        }
示例#21
0
        private CsdlOnDelete OnDeleteActionElement(XmlElementInfo element, XmlElementValueCollection childValues)
        {
            EdmOnDeleteAction action = RequiredOnDeleteAction(CsdlConstants.Attribute_Action);

            return(new CsdlOnDelete(action, element.Location));
        }
示例#22
0
        /// <summary>
        /// Creates two navigation properties representing an association between two entity types.
        /// </summary>
        /// <param name="propertyName">Navigation property name.</param>
        /// <param name="propertyType">Type of the navigation property.</param>
        /// <param name="dependentProperties">Dependent properties of the navigation source.</param>
        /// <param name="principalProperties">Principal properties of the navigation source.</param>
        /// <param name="containsTarget">A value indicating whether the navigation source logically contains the navigation target.</param>
        /// <param name="onDelete">Action to take upon deletion of an instance of the navigation source.</param>
        /// <param name="partnerPropertyName">Navigation partner property name.</param>
        /// <param name="partnerPropertyType">Type of the navigation partner property.</param>
        /// <param name="partnerDependentProperties">Dependent properties of the navigation target.</param>
        /// <param name="partnerPrincipalProperties">Principal properties of the navigation target.</param>
        /// <param name="partnerContainsTarget">A value indicating whether the navigation target logically contains the navigation source.</param>
        /// <param name="partnerOnDelete">Action to take upon deletion of an instance of the navigation target.</param>
        /// <returns>Navigation property.</returns>
        public static EdmNavigationProperty CreateNavigationPropertyWithPartner(
            string propertyName,
            IEdmTypeReference propertyType,
            IEnumerable<IEdmStructuralProperty> dependentProperties,
            IEnumerable<IEdmStructuralProperty> principalProperties,
            bool containsTarget,
            EdmOnDeleteAction onDelete,
            string partnerPropertyName,
            IEdmTypeReference partnerPropertyType,
            IEnumerable<IEdmStructuralProperty> partnerDependentProperties,
            IEnumerable<IEdmStructuralProperty> partnerPrincipalProperties,
            bool partnerContainsTarget,
            EdmOnDeleteAction partnerOnDelete)
        {
            EdmUtil.CheckArgumentNull(propertyName, "propertyName");
            EdmUtil.CheckArgumentNull(propertyType, "propertyType");
            EdmUtil.CheckArgumentNull(partnerPropertyName, "partnerPropertyName");
            EdmUtil.CheckArgumentNull(partnerPropertyType, "partnerPropertyType");

            IEdmEntityType declaringType = GetEntityType(partnerPropertyType);
            if (declaringType == null)
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "partnerPropertyType");
            }

            IEdmEntityType partnerDeclaringType = GetEntityType(propertyType);
            if (partnerDeclaringType == null)
            {
                throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "propertyType");
            }

            EdmNavigationProperty end1 = new EdmNavigationProperty(
                declaringType,
                propertyName,
                propertyType,
                dependentProperties,
                principalProperties,
                containsTarget,
                onDelete);

            EdmNavigationProperty end2 = new EdmNavigationProperty(
                partnerDeclaringType,
                partnerPropertyName,
                partnerPropertyType,
                partnerDependentProperties,
                partnerPrincipalProperties,
                partnerContainsTarget,
                partnerOnDelete);

            end1.partner = end2;
            end2.partner = end1;
            return end1;
        }
示例#23
0
		public static EdmNavigationProperty CreateNavigationPropertyWithPartner(string propertyName, IEdmTypeReference propertyType, IEnumerable<IEdmStructuralProperty> dependentProperties, bool containsTarget, EdmOnDeleteAction onDelete, string partnerPropertyName, IEdmTypeReference partnerPropertyType, IEnumerable<IEdmStructuralProperty> partnerDependentProperties, bool partnerContainsTarget, EdmOnDeleteAction partnerOnDelete)
		{
			EdmUtil.CheckArgumentNull<string>(propertyName, "propertyName");
			EdmUtil.CheckArgumentNull<IEdmTypeReference>(propertyType, "propertyType");
			EdmUtil.CheckArgumentNull<string>(partnerPropertyName, "partnerPropertyName");
			EdmUtil.CheckArgumentNull<IEdmTypeReference>(partnerPropertyType, "partnerPropertyType");
			IEdmEntityType entityType = EdmNavigationProperty.GetEntityType(partnerPropertyType);
			if (entityType != null)
			{
				IEdmEntityType edmEntityType = EdmNavigationProperty.GetEntityType(propertyType);
				if (edmEntityType != null)
				{
					EdmNavigationProperty edmNavigationProperty = new EdmNavigationProperty(entityType, propertyName, propertyType, dependentProperties, containsTarget, onDelete);
					EdmNavigationProperty edmNavigationProperty1 = new EdmNavigationProperty(edmEntityType, partnerPropertyName, partnerPropertyType, partnerDependentProperties, partnerContainsTarget, partnerOnDelete);
					edmNavigationProperty.partner = edmNavigationProperty1;
					edmNavigationProperty1.partner = edmNavigationProperty;
					return edmNavigationProperty;
				}
				else
				{
					throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "propertyType");
				}
			}
			else
			{
				throw new ArgumentException(Strings.Constructable_EntityTypeOrCollectionOfEntityTypeExpected, "partnerPropertyType");
			}
		}
示例#24
0
        /// <summary>Adds a new navigation property.</summary>
        /// <param name="entityType">The entity type to add the property to.</param>
        /// <param name="name">The name of the property to add.</param>
        /// <param name="deleteAction">The delete action of the nav property.</param>
        /// <param name="propertyTypeReference">The type of the property to add.</param>
        /// <param name="propertyInfo">If this is a CLR property, the <see cref="PropertyInfo"/> for the property, or null otherwise.</param>
        /// <param name="containsTarget">The contains target of the nav property</param>
        /// <returns>The newly created and added property.</returns>
        private IEdmNavigationProperty AddNavigationProperty(
            IEdmEntityType entityType,
            string name,
            EdmOnDeleteAction deleteAction,
            IEdmTypeReference propertyTypeReference,
            bool containsTarget)
        {
            // Create a navigation property representing one side of an association.
            // The partner representing the other side exists only inside this property and is not added to the target entity type,
            // so it should not cause any name collisions.
            EdmNavigationProperty navProperty = EdmNavigationProperty.CreateNavigationPropertyWithPartner(
                name,
                propertyTypeReference,
                /*dependentProperties*/ null,
                /*principalProperties*/ null,
                containsTarget,
                deleteAction,
                "Partner",
                entityType.ToTypeReference(true),
                /*partnerDependentProperties*/ null,
                /*partnerPrincipalProperties*/ null,
                /*partnerContainsTarget*/ false,
                EdmOnDeleteAction.None);

            ((EdmStructuredType)entityType).AddProperty(navProperty);

            return navProperty;
        }
 internal void FixUpNavigationProperty(IEdmNavigationProperty partnerProperty, bool isPrincipleEnd, EdmOnDeleteAction propertyDeleteAction)
 {
     this.partner      = partnerProperty;
     this.isPrinciple  = isPrincipleEnd;
     this.deleteAction = propertyDeleteAction;
 }
示例#26
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ActionOnDeleteAttribute"/> class.
 /// </summary>
 /// <param name="onDeleteAction">The action applied on delete.</param>
 public ActionOnDeleteAttribute(EdmOnDeleteAction onDeleteAction)
 {
     OnDeleteAction = onDeleteAction;
 }
示例#27
0
        internal static void FixUpNavigationPropertyWithAssociationSetData(IEdmNavigationProperty navigationProperty, IEdmNavigationProperty partner, bool isPrinciple, List <IEdmStructuralProperty> dependentProperties, EdmOnDeleteAction deleteAction, EdmMultiplicity opposingMultiplicity)
        {
            MetadataProviderEdmNavigationProperty property = navigationProperty as MetadataProviderEdmNavigationProperty;

            if (property != null)
            {
                property.FixUpNavigationProperty(partner, isPrinciple, deleteAction);
                if (opposingMultiplicity == EdmMultiplicity.One)
                {
                    property.Type = property.Type.Definition.ToTypeReference(false);
                }
                if ((dependentProperties != null) && !isPrinciple)
                {
                    property.SetDependentProperties(dependentProperties);
                }
            }
            else if ((dependentProperties != null) && !isPrinciple)
            {
                ((MetadataProviderEdmSilentNavigationProperty)navigationProperty).SetDependentProperties(dependentProperties);
            }
        }
 internal override void WriteNavigationOnDeleteActionElement(EdmOnDeleteAction operationAction)
 {
     this.xmlWriter.WriteStartElement(CsdlConstants.Element_OnDelete);
     this.WriteRequiredAttribute(CsdlConstants.Attribute_Action, operationAction.ToString(), EdmValueWriter.StringAsXml);
     this.WriteEndElement();
 }
示例#29
0
 internal abstract void WriteNavigationOnDeleteActionElement(EdmOnDeleteAction operationAction);
 /// <summary>
 /// Initializes a new instance of the <see cref="ActionOnDeleteAttribute"/> class.
 /// </summary>
 /// <param name="onDeleteAction">The action applied on delete.</param>
 public ActionOnDeleteAttribute(EdmOnDeleteAction onDeleteAction)
 {
     OnDeleteAction = onDeleteAction;
 }
 internal void WriteOperationActionElement(string elementName, EdmOnDeleteAction operationAction)
 {
     this.xmlWriter.WriteStartElement(elementName);
     this.WriteRequiredAttribute <string>("Action", operationAction.ToString(), new Func <string, string>(EdmValueWriter.StringAsXml));
     this.WriteEndElement();
 }