private void ProcessPost(ApiRequest request)
        {
            TENTITY objectToSave = null;

            JsonSerializerSettings settings = GetJsonSerializerSettings(request);

            string jsonIncomingEntity = request.JsonEntityData;

            if (request.IsDatasetApi)
            {
                objectToSave = DataObjectFactory.DeserializeFromContainer(jsonIncomingEntity, settings);

                // Case where trying to save existing object, not dirty => either:
                // (a) only PK is passed to the client, or
                // (b) the main/primary entity is not present in the incoming dataset, in which case the deserialize call above will have created a new instance of the main/primary entity
                // In both cases we should retrieve the main/primary object from database, and combine the datasets
                if (objectToSave.IsNew == false && objectToSave.IsDirty == false)
                {
                    var objectFromDatabase = DataProvider.Get(objectToSave);
                    objectFromDatabase.ObjectsDataSet.AddOrReplaceObject(objectToSave);
                    objectToSave = objectFromDatabase;
                }
            }
            else
            {
                objectToSave = DataObjectFactory.DeserializeObject(jsonIncomingEntity, settings);

                if (objectToSave != null)
                {
                    var dataset = ApplicationSettings.Container.Resolve <IObjectsDataSet>();
                    dataset.AddObject(objectToSave);
                    objectToSave.IsDirty = true;                     // Force Save
                }
            }

            if (objectToSave != null)
            {
                objectToSave.ObjectsDataSet.EnsureInitialized();
                objectToSave.ObjectsDataSet.ReconstructIndexes();
            }

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = objectToSave.IsNew ? "CREATE" : "UPDATE", context = "BEFORE SAVE", data = ""
            });

            string response = String.Empty;
            var    result   = DataProvider.Save(objectToSave, null, request.IncludeList);

            if (result == null)
            {
                if (!objectToSave.IsMarkedForDeletion)
                {
                    throw new ResourceNotFoundException();
                }
                else
                {
                    response = null;
                }
            }
            else
            {
                result.ObjectsDataSet.SerializeTechnicalProperties = false;

                if (!request.IsDatasetApi)
                {
                    result.ObjectsDataSet.InitializeRelationsToInclude(typeof(TENTITY), request.Includes);
                }

                object dataToSerialize = request.IsDatasetApi ? DataObjectFactory.CreateDataSetContainer(result) : result;

                response = JsonConvert.SerializeObject(dataToSerialize, settings);
            }

            // Notify extensions
            Extensions.OnRequestAction(new ApiExtensionResponseData {
                action = objectToSave.IsNew ? "CREATE" : "UPDATE", context = "JSON WRITE", data = response
            });

            WriteResponse(request.HttpContext, response);
        }