private static IEdmTypeReference GetEdmTypeReference(Dictionary <Type, IEdmType> availableTypes, IEdmTypeConfiguration configuration, bool nullable) { Contract.Assert(availableTypes != null); if (configuration == null) { return(null); } EdmTypeKind kind = configuration.Kind; if (kind == EdmTypeKind.Collection) { CollectionTypeConfiguration collectionType = (CollectionTypeConfiguration)configuration; EdmCollectionType edmCollectionType = new EdmCollectionType(GetEdmTypeReference(availableTypes, collectionType.ElementType, nullable)); return(new EdmCollectionTypeReference(edmCollectionType)); } else { Type configurationClrType = TypeHelper.GetUnderlyingTypeOrSelf(configuration.ClrType); if (!configurationClrType.GetTypeInfo().IsEnum) { configurationClrType = configuration.ClrType; } IEdmType type; if (availableTypes.TryGetValue(configurationClrType, out type)) { if (kind == EdmTypeKind.Complex) { return(new EdmComplexTypeReference((IEdmComplexType)type, nullable)); } else if (kind == EdmTypeKind.Entity) { return(new EdmEntityTypeReference((IEdmEntityType)type, nullable)); } else if (kind == EdmTypeKind.Enum) { return(new EdmEnumTypeReference((IEdmEnumType)type, nullable)); } else { throw Error.InvalidOperation(SRResources.UnsupportedEdmTypeKind, kind.ToString()); } } else if (configuration.Kind == EdmTypeKind.Primitive) { PrimitiveTypeConfiguration primitiveTypeConfiguration = configuration as PrimitiveTypeConfiguration; return(new EdmPrimitiveTypeReference(primitiveTypeConfiguration.EdmPrimitiveType, nullable)); } else { throw Error.InvalidOperation(SRResources.NoMatchingIEdmTypeFound, configuration.FullName); } } }
/// <summary> /// Registers an entity type as part of the model and returns an object that can be used to configure the entity. /// This method can be called multiple times for the same entity to perform multiple lines of configuration. /// </summary> /// <param name="type">The type to be registered or configured.</param> /// <returns>The configuration object for the specified entity type.</returns> public virtual PrimitiveTypeConfiguration AddPrimitiveType(Type type) { if (type == null) { throw Error.ArgumentNull("type"); } if (!_primitiveTypes.ContainsKey(type)) { PrimitiveTypeConfiguration entityTypeConfig = new PrimitiveTypeConfiguration(this, EdmLibHelpers.GetEdmPrimitiveTypeOrNull(type), type); _primitiveTypes.Add(type, entityTypeConfig); return(entityTypeConfig); } else { PrimitiveTypeConfiguration config = _primitiveTypes[type]; if (config == null || config.ClrType != type) { throw Error.Argument("type", SRResources.TypeMustBeEntity, type.FullName); } return(config); } }