/// <summary>
        /// Función para eliminar una lista de entidades relacionadas desde la base de datos
        /// </summary>
        /// <param name="collectionDataAccess">IDataAccess de la relacion</param>
        /// <param name="collection">La colección de entidades a eliminar</param>
        /// <param name="scope">Estructura interna para evitar problemas de referencia circular</param>
        /// <returns>True si la colección no es nula</returns>
        private bool DeleteServiceCategoryCollection(ServiceCategoryDataAccess collectionDataAccess, Collection <ServiceCategoryEntity> collection, Dictionary <string, IEntity> scope)
        {
            if (collection == null)
            {
                return(false);
            }
            // Establece los objetos de conexión al data access de la relación.
            collectionDataAccess.SetConnectionObjects(dbConnection, dbTransaction);
            // Elimina los objetos relacionados

            for (int i = 0; i < collection.Count; i++)
            {
                collectionDataAccess.Delete(collection[i], scope);
            }
            return(true);
        }
        /// <summary>
        /// Función que carga la relacion ServiceCategory desde la base de datos
        /// </summary>
        /// <param name="service">Entidad padre ServiceEntity</param>
        /// <param name="scope">Estructura de datos interna para evitar los problemas de referencia circular</param>
        /// <exception cref="ArgumentNullException">
        /// Si <paramref name="service"/> no es un <c>ServiceEntity</c>.
        /// </exception>
        public void LoadRelationServiceCategory(ServiceEntity service, Dictionary <string, IEntity> scope)
        {
            if (service == null)
            {
                throw new ArgumentException("The argument can't be null");
            }
            // Crea un objeto data access para los objetos relacionados
            ServiceCategoryDataAccess serviceCategoryDataAccess = new ServiceCategoryDataAccess();

            // Establece los objetos de la conexión al data access de la relacion

            serviceCategoryDataAccess.SetConnectionObjects(dbConnection, dbTransaction);
            // Carga los objetos relacionadoss

            service.ServiceCategory = serviceCategoryDataAccess.LoadByServiceCollection(service.Id, scope);
        }
        /// <summary>
        /// Actualiza la base de datos para reflejar el estado actual de la lista.
        /// </summary>
        /// <param name="collectionDataAccess">El IDataAccess de la relación</param>
        /// <param name="parent">El objeto padre</param>
        /// <param name="collection">una colección de items</param>
        /// <param name="isNewParent">Si el padre es un objeto nuevo</param>
        /// <param name="scope">Estructura de datos interna para evitar problemas de referencia circular</param>
        /// <exception cref="UtnEmallDataAccessException">
        /// Si una DbException ocurre cuando se accede a la base de datos
        /// </exception>
        private void SaveServiceCategoryCollection(ServiceCategoryDataAccess collectionDataAccess, ServiceEntity parent, Collection <ServiceCategoryEntity> collection, bool isNewParent, Dictionary <string, IEntity> scope)
        {
            if (collection == null)
            {
                return;
            }
            // Establece los objetos de conexión
            collectionDataAccess.SetConnectionObjects(dbConnection, dbTransaction);
            // Establece la relación padre/hijo

            for (int i = 0; i < collection.Count; i++)
            {
                bool changed = collection[i].Changed;
                collection[i].Service = parent;
                collection[i].Changed = changed;
            }
            // Si el padre es nuevo guarda todos los hijos, sino controla las diferencias con la base de datos.

            if (isNewParent)
            {
                for (int i = 0; i < collection.Count; i++)
                {
                    collectionDataAccess.Save(collection[i], scope);
                }
            }
            else
            {
                // Controla los hijos que ya no son parte de la relación
                string idList = "0";
                if (collection.Count > 0)
                {
                    idList = "" + collection[0].Id;
                }

                for (int i = 1; i < collection.Count; i++)
                {
                    idList += ", " + collection[i].Id;
                }
                // Retorna los ids que ya no existe en la colección actual

                string command = "SELECT idServiceCategory FROM [ServiceCategory] WHERE idService = @idService AND idServiceCategory NOT IN (" + idList + ")";

                SqlCeCommand sqlCommand = dataAccess.GetNewCommand(command, dbConnection, dbTransaction);

                SqlCeParameter sqlParameterId = dataAccess.GetNewDataParameter("@idService", DbType.Int32);
                sqlParameterId.Value = parent.Id;
                sqlCommand.Parameters.Add(sqlParameterId);

                IDataReader reader = sqlCommand.ExecuteReader();
                Collection <ServiceCategoryEntity> objectsToDelete = new Collection <ServiceCategoryEntity>();
                // Inserta los id en una lista

                List <int> listId = new List <int>();
                while (reader.Read())
                {
                    listId.Add(reader.GetInt32(0));
                }

                reader.Close();
                // Carga los items a ser eliminados

                foreach (int id in listId)
                {
                    ServiceCategoryEntity entityToDelete = collectionDataAccess.Load(id, scope);
                    objectsToDelete.Add(entityToDelete);
                }
                // Esto se realiza porque el reader debe ser cerrado despues de eliminar las entidades

                for (int i = 0; i < objectsToDelete.Count; i++)
                {
                    collectionDataAccess.Delete(objectsToDelete[i], scope);
                }

                System.DateTime timestamp;
                // Controla todas las propiedades de los items de la colección
                // para verificar si alguno cambio

                for (int i = 0; i < collection.Count; i++)
                {
                    ServiceCategoryEntity item = collection[i];
                    if (!item.Changed && !item.IsNew)
                    {
                        // Crea el command
                        string       sql = "SELECT timestamp FROM [ServiceCategory] WHERE idServiceCategory = @idServiceCategory";
                        SqlCeCommand sqlCommandTimestamp = dataAccess.GetNewCommand(sql, dbConnection, dbTransaction);
                        // Establece los datos a los parametros del command

                        SqlCeParameter sqlParameterIdPreference = dataAccess.GetNewDataParameter("@idServiceCategory", DbType.Int32);
                        sqlParameterIdPreference.Value = item.Id;
                        sqlCommandTimestamp.Parameters.Add(sqlParameterIdPreference);

                        timestamp = ((System.DateTime)sqlCommandTimestamp.ExecuteScalar());
                        if (item.Timestamp != timestamp)
                        {
                            item.Changed = true;
                        }
                    }
                    // Guarda el item si cambio o es nuevo

                    if (item.Changed || item.IsNew)
                    {
                        collectionDataAccess.Save(item);
                    }
                }
            }
        }