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)); } } }
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); }