/// <summary>
        ///     Binds the model to a value by using the specified controller context and binding context.
        /// </summary>
        /// <returns>
        ///     The bound value.
        /// </returns>
        /// <param name = "controllerContext">The controller context.</param>
        /// <param name = "bindingContext">The binding context.</param>
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var collectionType       = bindingContext.ModelType;
            var collectionEntityType = collectionType.GetGenericArguments().First();

            var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            if (valueProviderResult == null)
            {
                return(base.BindModel(controllerContext, bindingContext));
            }
            var rawValue = valueProviderResult.RawValue as string[];

            var countOfEntityIds = rawValue.Length;
            var entities         = Array.CreateInstance(collectionEntityType, countOfEntityIds);

            var entityInterfaceType =
                collectionEntityType.GetInterfaces().First(
                    interfaceType =>
                    interfaceType.IsGenericType &&
                    interfaceType.GetGenericTypeDefinition() == typeof(IEntityWithTypedId <>));

            var idType = entityInterfaceType.GetGenericArguments().First();

            for (var i = 0; i < countOfEntityIds; i++)
            {
                var rawId = rawValue[i];

                if (string.IsNullOrEmpty(rawId))
                {
                    return(null);
                }

                var typedId = (idType == typeof(Guid)) ? new Guid(rawId) : Convert.ChangeType(rawId, idType);
                var entity  = EntityRetriever.GetEntityFor(collectionEntityType, typedId, idType);
                entities.SetValue(entity, i);
            }

            // base.BindModel(controllerContext, bindingContext);
            return(entities);
        }
        /// <summary>
        ///     Binds the model value to an entity by using the specified controller context and binding context.
        /// </summary>
        /// <returns>
        ///     The bound value.
        /// </returns>
        /// <param name = "controllerContext">The controller context.</param>
        /// <param name = "bindingContext">The binding context.</param>
        public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            var modelType = bindingContext.ModelType;

            // Will look for the entity Id either named "ModelName" or "ModelName.Id"
            var valueProviderResult =
                bindingContext.ValueProvider.GetValue(bindingContext.ModelName) ??
                bindingContext.ValueProvider.GetValue(bindingContext.ModelName + ".Id");

            if (valueProviderResult == null)
            {
                return(base.BindModel(controllerContext, bindingContext));
            }
            var entityInterfaceType =
                modelType.GetInterfaces().First(
                    interfaceType =>
                    interfaceType.IsGenericType &&
                    interfaceType.GetGenericTypeDefinition() == typeof(IEntityWithTypedId <>));

            var idType = entityInterfaceType.GetGenericArguments().First();
            var rawId  = (valueProviderResult.RawValue as string[]).First();

            if (string.IsNullOrEmpty(rawId))
            {
                return(null);
            }

            try {
                var typedId = (idType == typeof(Guid)) ? new Guid(rawId) : Convert.ChangeType(rawId, idType);
                return(EntityRetriever.GetEntityFor(modelType, typedId, idType));
            }
            catch (Exception) {
                // If the Id conversion failed for any reason, just return null
                return(null);
            }
        }