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