예제 #1
0
 private static void ValidateMembersMatch(EdmMember edmMember, EdmMember objectMember)
 {
     if (edmMember.BuiltInTypeKind != objectMember.BuiltInTypeKind)
     {
         throw new MappingException(Strings.Mapping_Default_OCMapping_MemberKind_Mismatch((object)edmMember.Name, (object)edmMember.DeclaringType.FullName, (object)edmMember.BuiltInTypeKind, (object)objectMember.Name, (object)objectMember.DeclaringType.FullName, (object)objectMember.BuiltInTypeKind));
     }
     if (edmMember.TypeUsage.EdmType.BuiltInTypeKind != objectMember.TypeUsage.EdmType.BuiltInTypeKind)
     {
         throw Error.Mapping_Default_OCMapping_Member_Type_Mismatch((object)edmMember.TypeUsage.EdmType.Name, (object)edmMember.TypeUsage.EdmType.BuiltInTypeKind, (object)edmMember.Name, (object)edmMember.DeclaringType.FullName, (object)objectMember.TypeUsage.EdmType.Name, (object)objectMember.TypeUsage.EdmType.BuiltInTypeKind, (object)objectMember.Name, (object)objectMember.DeclaringType.FullName);
     }
     if (Helper.IsPrimitiveType(edmMember.TypeUsage.EdmType))
     {
         if (Helper.GetSpatialNormalizedPrimitiveType(edmMember.TypeUsage.EdmType).PrimitiveTypeKind != ((PrimitiveType)objectMember.TypeUsage.EdmType).PrimitiveTypeKind)
         {
             throw new MappingException(Strings.Mapping_Default_OCMapping_Invalid_MemberType((object)edmMember.TypeUsage.EdmType.FullName, (object)edmMember.Name, (object)edmMember.DeclaringType.FullName, (object)objectMember.TypeUsage.EdmType.FullName, (object)objectMember.Name, (object)objectMember.DeclaringType.FullName));
         }
     }
     else if (Helper.IsEnumType(edmMember.TypeUsage.EdmType))
     {
         DefaultObjectMappingItemCollection.ValidateEnumTypeMapping((EnumType)edmMember.TypeUsage.EdmType, (EnumType)objectMember.TypeUsage.EdmType);
     }
     else
     {
         EdmType edmType1;
         EdmType edmType2;
         if (edmMember.BuiltInTypeKind == BuiltInTypeKind.AssociationEndMember)
         {
             edmType1 = (EdmType)((RefType)edmMember.TypeUsage.EdmType).ElementType;
             edmType2 = (EdmType)((RefType)objectMember.TypeUsage.EdmType).ElementType;
         }
         else if (BuiltInTypeKind.NavigationProperty == edmMember.BuiltInTypeKind && Helper.IsCollectionType((GlobalItem)edmMember.TypeUsage.EdmType))
         {
             edmType1 = ((CollectionType)edmMember.TypeUsage.EdmType).TypeUsage.EdmType;
             edmType2 = ((CollectionType)objectMember.TypeUsage.EdmType).TypeUsage.EdmType;
         }
         else
         {
             edmType1 = edmMember.TypeUsage.EdmType;
             edmType2 = objectMember.TypeUsage.EdmType;
         }
         if (edmType1.Identity != ObjectItemCollection.TryGetMappingCSpaceTypeIdentity(edmType2))
         {
             throw new MappingException(Strings.Mapping_Default_OCMapping_Invalid_MemberType((object)edmMember.TypeUsage.EdmType.FullName, (object)edmMember.Name, (object)edmMember.DeclaringType.FullName, (object)objectMember.TypeUsage.EdmType.FullName, (object)objectMember.Name, (object)objectMember.DeclaringType.FullName));
         }
     }
 }
        // <summary>
        // Search for a Mapping metadata with the specified type key.
        // </summary>
        // <param name="identity"> identity of the type </param>
        // <param name="typeSpace"> The dataspace that the type for which map needs to be returned belongs to </param>
        // <param name="ignoreCase"> true for case-insensitive lookup </param>
        // <returns> Returns false if no match found. </returns>
        internal override bool TryGetMap(string identity, DataSpace typeSpace, bool ignoreCase, out MappingBase map)
        {
            EdmType cdmType = null;
            EdmType clrType = null;

            if (typeSpace == DataSpace.CSpace)
            {
                if (ignoreCase)
                {
                    // Get the correct casing of the identity first if we are asked to do ignore case
                    if (!_edmCollection.TryGetItem(identity, true, out cdmType))
                    {
                        map = null;
                        return(false);
                    }

                    identity = cdmType.Identity;
                }

                int index;
                if (_edmTypeIndexes.TryGetValue(identity, out index))
                {
                    map = (MappingBase)this[index];
                    return(true);
                }

                if (cdmType != null
                    ||
                    _edmCollection.TryGetItem(identity, ignoreCase, out cdmType))
                {
                    // If the mapping is not already loaded, then get the mapping ospace type
                    _objectCollection.TryGetOSpaceType(cdmType, out clrType);
                }
            }
            else if (typeSpace == DataSpace.OSpace)
            {
                if (ignoreCase)
                {
                    // Get the correct casing of the identity first if we are asked to do ignore case
                    if (!_objectCollection.TryGetItem(identity, true, out clrType))
                    {
                        map = null;
                        return(false);
                    }

                    identity = clrType.Identity;
                }

                int index;
                if (_clrTypeIndexes.TryGetValue(identity, out index))
                {
                    map = (MappingBase)this[index];
                    return(true);
                }

                if (clrType != null
                    ||
                    _objectCollection.TryGetItem(identity, ignoreCase, out clrType))
                {
                    // If the mapping is not already loaded, get the mapping cspace type
                    var cspaceTypeName = ObjectItemCollection.TryGetMappingCSpaceTypeIdentity(clrType);
                    _edmCollection.TryGetItem(cspaceTypeName, out cdmType);
                }
            }

            if ((clrType == null) ||
                (cdmType == null))
            {
                map = null;
                return(false);
            }
            else
            {
                map = GetDefaultMapping(cdmType, clrType);
                return(true);
            }
        }
        private static void ValidateMembersMatch(EdmMember edmMember, EdmMember objectMember)
        {
            Debug.Assert(edmMember.DeclaringType.DataSpace == DataSpace.CSpace, "the cspace member is not on a cspace type");
            Debug.Assert(objectMember.DeclaringType.DataSpace == DataSpace.OSpace, "the ospace member is not on a cspace type");

            // Make sure the property type is the same
            if (edmMember.BuiltInTypeKind
                != objectMember.BuiltInTypeKind)
            {
                throw new MappingException(
                          Strings.Mapping_Default_OCMapping_MemberKind_Mismatch(
                              edmMember.Name, edmMember.DeclaringType.FullName, edmMember.BuiltInTypeKind,
                              objectMember.Name, objectMember.DeclaringType.FullName, objectMember.BuiltInTypeKind));
            }

            // Make sure the member type is the same
            if (edmMember.TypeUsage.EdmType.BuiltInTypeKind
                != objectMember.TypeUsage.EdmType.BuiltInTypeKind)
            {
                throw Error.Mapping_Default_OCMapping_Member_Type_Mismatch(
                          edmMember.TypeUsage.EdmType.Name, edmMember.TypeUsage.EdmType.BuiltInTypeKind, edmMember.Name,
                          edmMember.DeclaringType.FullName,
                          objectMember.TypeUsage.EdmType.Name, objectMember.TypeUsage.EdmType.BuiltInTypeKind, objectMember.Name,
                          objectMember.DeclaringType.FullName);
            }

            if (Helper.IsPrimitiveType(edmMember.TypeUsage.EdmType))
            {
                var memberType = Helper.GetSpatialNormalizedPrimitiveType(edmMember.TypeUsage.EdmType);

                // We expect the CLR primitive type and their corresponding EDM primitive types to have the same primitive type kind (at least for now)
                if (memberType.PrimitiveTypeKind
                    != ((PrimitiveType)objectMember.TypeUsage.EdmType).PrimitiveTypeKind)
                {
                    throw new MappingException(
                              Strings.Mapping_Default_OCMapping_Invalid_MemberType(
                                  edmMember.TypeUsage.EdmType.FullName, edmMember.Name, edmMember.DeclaringType.FullName,
                                  objectMember.TypeUsage.EdmType.FullName, objectMember.Name, objectMember.DeclaringType.FullName));
                }
            }
            else if (Helper.IsEnumType(edmMember.TypeUsage.EdmType))
            {
                Debug.Assert(
                    Helper.IsEnumType(objectMember.TypeUsage.EdmType),
                    "Both types are expected to by EnumTypes. For non-matching types we should have already thrown.");

                ValidateEnumTypeMapping((EnumType)edmMember.TypeUsage.EdmType, (EnumType)objectMember.TypeUsage.EdmType);
            }
            else
            {
                EdmType edmMemberType;
                EdmType objectMemberType;

                if (BuiltInTypeKind.AssociationEndMember
                    == edmMember.BuiltInTypeKind)
                {
                    edmMemberType    = ((RefType)edmMember.TypeUsage.EdmType).ElementType;
                    objectMemberType = ((RefType)objectMember.TypeUsage.EdmType).ElementType;
                }
                else if (BuiltInTypeKind.NavigationProperty == edmMember.BuiltInTypeKind
                         &&
                         Helper.IsCollectionType(edmMember.TypeUsage.EdmType))
                {
                    edmMemberType    = ((CollectionType)edmMember.TypeUsage.EdmType).TypeUsage.EdmType;
                    objectMemberType = ((CollectionType)objectMember.TypeUsage.EdmType).TypeUsage.EdmType;
                }
                else
                {
                    edmMemberType    = edmMember.TypeUsage.EdmType;
                    objectMemberType = objectMember.TypeUsage.EdmType;
                }

                if (edmMemberType.Identity
                    != ObjectItemCollection.TryGetMappingCSpaceTypeIdentity(objectMemberType))
                {
                    throw new MappingException(
                              Strings.Mapping_Default_OCMapping_Invalid_MemberType(
                                  edmMember.TypeUsage.EdmType.FullName, edmMember.Name, edmMember.DeclaringType.FullName,
                                  objectMember.TypeUsage.EdmType.FullName, objectMember.Name, objectMember.DeclaringType.FullName));
                }
            }
        }
예제 #4
0
        internal override bool TryGetMap(
            string identity,
            DataSpace typeSpace,
            bool ignoreCase,
            out MappingBase map)
        {
            EdmType edmType1 = (EdmType)null;
            EdmType edmType2 = (EdmType)null;

            switch (typeSpace)
            {
            case DataSpace.OSpace:
                if (ignoreCase)
                {
                    if (!this._objectCollection.TryGetItem <EdmType>(identity, true, out edmType2))
                    {
                        map = (MappingBase)null;
                        return(false);
                    }
                    identity = edmType2.Identity;
                }
                int index1;
                if (this._clrTypeIndexes.TryGetValue(identity, out index1))
                {
                    map = (MappingBase)this[index1];
                    return(true);
                }
                if (edmType2 != null || this._objectCollection.TryGetItem <EdmType>(identity, ignoreCase, out edmType2))
                {
                    this._edmCollection.TryGetItem <EdmType>(ObjectItemCollection.TryGetMappingCSpaceTypeIdentity(edmType2), out edmType1);
                    break;
                }
                break;

            case DataSpace.CSpace:
                if (ignoreCase)
                {
                    if (!this._edmCollection.TryGetItem <EdmType>(identity, true, out edmType1))
                    {
                        map = (MappingBase)null;
                        return(false);
                    }
                    identity = edmType1.Identity;
                }
                int index2;
                if (this._edmTypeIndexes.TryGetValue(identity, out index2))
                {
                    map = (MappingBase)this[index2];
                    return(true);
                }
                if (edmType1 != null || this._edmCollection.TryGetItem <EdmType>(identity, ignoreCase, out edmType1))
                {
                    this._objectCollection.TryGetOSpaceType(edmType1, out edmType2);
                    break;
                }
                break;
            }
            if (edmType2 == null || edmType1 == null)
            {
                map = (MappingBase)null;
                return(false);
            }
            map = this.GetDefaultMapping(edmType1, edmType2);
            return(true);
        }