/// <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 DeleteStoreCategoryCollection(StoreCategoryDataAccess collectionDataAccess, Collection <StoreCategoryEntity> 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> /// 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 SaveStoreCategoryCollection(StoreCategoryDataAccess collectionDataAccess, StoreEntity parent, Collection <StoreCategoryEntity> 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].Store = 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 idStoreCategory FROM [StoreCategory] WHERE idStore = @idStore AND idStoreCategory NOT IN (" + idList + ")"; SqlCeCommand sqlCommand = dataAccess.GetNewCommand(command, dbConnection, dbTransaction); SqlCeParameter sqlParameterId = dataAccess.GetNewDataParameter("@idStore", DbType.Int32); sqlParameterId.Value = parent.Id; sqlCommand.Parameters.Add(sqlParameterId); IDataReader reader = sqlCommand.ExecuteReader(); Collection <StoreCategoryEntity> objectsToDelete = new Collection <StoreCategoryEntity>(); // 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) { StoreCategoryEntity 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++) { StoreCategoryEntity item = collection[i]; if (!item.Changed && !item.IsNew) { // Crea el command string sql = "SELECT timestamp FROM [StoreCategory] WHERE idStoreCategory = @idStoreCategory"; SqlCeCommand sqlCommandTimestamp = dataAccess.GetNewCommand(sql, dbConnection, dbTransaction); // Establece los datos a los parametros del command SqlCeParameter sqlParameterIdPreference = dataAccess.GetNewDataParameter("@idStoreCategory", 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); } } } }