/// <summary> /// Recebe um objeto item a ser alterado e suas respectivas relações com coleções /// </summary> /// <param name="itemAlterado">Objeto item a ser alterado</param> /// <returns></returns> public int Alterar(Item itemAlterado) { if (itemAlterado != null && !string.IsNullOrEmpty(itemAlterado.Nome.Trim())) { try { using (ColecionadorEntities contexto = new ColecionadorEntities(Util.ConnectionString)) { //Recupera o item atual que está armazenado no BD Item itemAtual = contexto.Item.Find(itemAlterado.Codigo); //Alteração dos dados que estão relacionados especificamente ao item itemAtual.Nome = itemAlterado.Nome; itemAtual.Descricao = itemAlterado.Descricao; //... //Consulta Linq para obter as coleções que devem ser excluídas do item atual var colecoesDeletadas = (from c in itemAtual.Colecoes where !(from c1 in itemAlterado.Colecoes select c1.Codigo).Contains(c.Codigo) select c).ToList(); //Consulta Linq para obter as coleções que devem ser adicionadas ao item atual var colecoesAdicionadas = (from c in itemAlterado.Colecoes where !(from c1 in itemAtual.Colecoes select c1.Codigo).Contains(c.Codigo) select c).ToList(); //Exclusão das coleções relacionados ao item atual colecoesDeletadas.ForEach(c => itemAtual.Colecoes.Remove(c)); //Adição das novas coleções relacionadas ao item atual foreach (Colecao c in colecoesAdicionadas) { //Como os objetos Colecao vieram de outro contexto é necessário verificar se os mesmos já foram "Attachados" a esse if (contexto.Entry(c).State == System.Data.EntityState.Detached) contexto.Colecao.Attach(c); itemAtual.Colecoes.Add(c); } //Confirmação dos dados no BD return contexto.SaveChanges(); } } catch { return -2; } } else return -1; }
/// <summary> /// Recebe o código da Colecao e devolve o objeto com todas as informações sobre a mesma /// </summary> /// <param name="codigoColecao">Código da Colecao que se deseja obter</param> /// <returns></returns> public Colecao ObterColecao(int codigoColecao) { if (codigoColecao > 0) { using (var contexto = new ColecionadorEntities(Util.ConnectionString)) { return (from c in contexto.Colecao where c.Codigo == codigoColecao select c).FirstOrDefault(); } } else return null; }
/// <summary> /// Recebe o código do item a ser excluído e exclui o objeto item e suas respectivas relações no BD /// </summary> /// <param name="codigoItem">Código do item a ser excluído</param> /// <returns></returns> public int Excluir(int codigoItem) { try { using (ColecionadorEntities contexto = new ColecionadorEntities(Util.ConnectionString)) { Item item = contexto.Item.Find(codigoItem); List<Colecao> colecoes = item.Colecoes.ToList(); colecoes.ForEach(c => item.Colecoes.Remove(c)); contexto.Item.Remove(item); return contexto.SaveChanges(); } } catch { return -1; } }
/// <summary> /// Recebe o código de um item e devolve um objeto completo sobre o mesmo /// </summary> /// <param name="codigoItem">Código do item a ser recuperado</param> /// <returns></returns> public Item Obter(int codigoItem) { if (codigoItem > 0) { using (var contexto = new ColecionadorEntities(Util.ConnectionString)) { /* Utilizado para que os objetos Colecao sejam incluídos ao objeto item * no momento em que ele for retornado. Isso é necessário pois deixaremos o contexto * onde o mesmo foi criado e portando deixaremos de ter a referencia da conexão * para realizar o Lazy-Loading (acesso aos dados relacionados após a leitura inicial do objeto pai) */ contexto.Item.Include("Colecoes").ToList(); Item i = contexto.Item.Find(codigoItem); return i; } } else return null; }
/// <summary> /// Recebe um objeto item e suas respectivas coleções e o armazena no banco de dados /// </summary> /// <param name="novoItem">Objeto item</param> /// <returns></returns> public int Gravar(Item novoItem) { if (novoItem != null && !string.IsNullOrEmpty(novoItem.Nome.Trim())) { try { using (ColecionadorEntities contexto = new ColecionadorEntities(Util.ConnectionString)) { /* É necessário fazer esse foreach para o EF entender que as coleções * associadas já fazem parte dos dados existentes do BD/Modelo Conceitual, * sendo assim, ele não precisará fazer o insert nas coleções também. */ foreach (Colecao c in novoItem.Colecoes) contexto.Colecao.Attach(c); contexto.Item.Add(novoItem); return contexto.SaveChanges(); } } catch { return -2; } } else return -1; }