EXCLUIR REGISTROS EM TRÊS TABELAS

 Tópico anterior Próximo tópico Novo tópico

EXCLUIR REGISTROS EM TRÊS TABELAS

ASP.NET

 Compartilhe  Compartilhe  Compartilhe
#480879 - 16/04/2018 08:37:47

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom dia pessoal, quem me conhece pôde reparar que eu fiquei um bom tempo sem participar do VbMania, inclusive um amigo do forum o DS2T na época me disse que eu estava progredindo muito, e realmente eu estava, mas por questões pessoais, problemas de saúde, decepções, desânimos e outras coisas mais acabei abandonando tudo e devido ao longo tempo, esqueci de muita coisa, por isso não se assustem se virem que eu sou cadastrado no forum faz muito tempo e de repente postar alguma coisa que possa parecer idiota ou do tipo "nossa, é programador faz tanto tempo e está perguntando isso agora?", afinal de contas quando eu comecei a frequentar o forum eu ainda esta aprendendo VB.Net, depois veio o C#, aí com a ajuda do Kerplunk aprendi muita coisa, principalmente a orientação a objeto, depois veio o Entity Framework, aí veio o Asp.Net, aprendi um pouco de HTML, CSS, o JavaScrit que eu ainda vou aprender, quero ainda aprender o JQuery e o Angular (por que não?), adoro aprender, mas é que por tudo o que me aconteceu é natural que muita coisa eu tenha esquecido ou ficou adormecido. Mas deixando de papo furado, aí vai a minha questão:

Eu tenho um cadastro de CDs onde tenho 3 Models:

Artista            
--------
public int Id                    
public string Nome                  
public string Logotipo
public virtual IList<Trabalho> Trabalhos            
                      
Trabalho
---------
public int Id
public string Nome
public int Ano
public string Capa
public int ArtistaId
public Artista Artista
public virtual IList<Faixa> Faixas

Faixa
-------
public int Id
public int Numero
public string Nome
public string Capa
public int TrabalhoId
public Trabalho Trabalho

As ActionResults Delete e DeleteConfirmed da ArtistasController estão dessa maneira:

public ActionResult Delete(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Artista artista = db.Artista.Find(id);
    if (artista == null)
    {
        return HttpNotFound();
    }
     return View(artista);
}


[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(int id)
{
    Artista artista = db.Artista.Find(id);
    db.Artista.Remove(artista);
    db.SaveChanges();
    return RedirectToAction("Index");
}

Então eu gostaria de saber qual é a maneira correta de se fazer com que ao excluir um artista, exclua também todos os trabalhos desse artista e consequentemente todas as faixas de todos os trabalhos desse mesmo artista?


____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




Resposta escolhida #480880 - 16/04/2018 09:17:10

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Para isso, você precisa montar sua model(usando o approach Code First), informando que você quer usar cascateamento no evento de deleção, mais ou menos assim:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{  
    modelBuilder.Entity<Artista>()
        .HasOptional(a => a.Trabalhos)
        .WithOptionalDependent()
        .WillCascadeOnDelete(true);
}


_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#480882 - 16/04/2018 09:50:51

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Kerplunk, algo está errado, depois de fazer essa alteração, quando rodo o projeto dá uma mensagem de erro na view Index, dizendo que o nome da coluna não é válido:
The column name is not valid. [ Node name (if any) = Extent1,Column name = Trabalhos_Id ]"}
Por que? Eu não tenho essa coluna Trabalhos_Id.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#480883 - 16/04/2018 10:04:33

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Você precisa dos decoradores para usar o EF de maneira correta, um deles é o "[Key]" na coluna(propriedade) que é a chave primária.

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#480885 - 16/04/2018 10:22:28

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom Kerp, não sei onde estou errando, mas não deu certo, mas e se eu fizer "à moda antiga" mesmo, usando Linq, ficaria mais ou menos assim:

       public ActionResult DeleteConfirmed(int id)
        {
            var deletarTrabalhos = from t in db.Trabalho
                          where t.ArtistaId == id
                          select t;
            foreach (var item in deletarTrabalhos)
            {
                db.Trabalho.Remove(item);
                db.SaveChanges();
            }

            Artista artista = db.Artista.Find(id);
            db.Artista.Remove(artista);
            db.SaveChanges();
            return RedirectToAction("Index");
        }


É errado fazer isso, ou não tem problema? Não é uma boa prática?

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




#480888 - 16/04/2018 11:26:29

KERPLUNK
RIO GRANDE DO SUL
Cadast. em:Junho/2009


Membro da equipe
Não é errado propriamente, se atende o que você quer, ok. O caso é que existe uma maneira mais automática para fazer isso, usando annotations e fluent API

_______________________________________________________________________
Gostaria de ter seu sistema Desktop "traduzido" para uma interface web? Podemos conversar...
Virei Oráculo!
The end is nigh, be ready for the nukes!


#480903 - 16/04/2018 17:21:41

GUIMORAES
ITAPETININGA
Cadast. em:Agosto/2009


Última edição em 16/04/2018 17:22:51 por GUIMORAES

Citação:
:
Bom Kerp, não sei onde estou errando, mas não deu certo, mas e se eu fizer "à moda antiga" mesmo, usando Linq, ficaria mais ou menos assim:

       public ActionResult DeleteConfirmed(int id)
        {
            var deletarTrabalhos = from t in db.Trabalho
                          where t.ArtistaId == id
                          select t;
            foreach (var item in deletarTrabalhos)
            {
                db.Trabalho.Remove(item);
                db.SaveChanges();
            }

            Artista artista = db.Artista.Find(id);
            db.Artista.Remove(artista);
            db.SaveChanges();
            return RedirectToAction("Index");
        }


É errado fazer isso, ou não tem problema? Não é uma boa prática?


É, este é um processo que poderia ser automatizado pelo banco de dados, utilizando o "on delete cascade".




#481016 - 19/04/2018 10:16:15

PERCIFILHO
MATAO [SP]
Cadast. em:Dezembro/2009


Bom, como não consegui do jeito que o Kerplunk me falou, vou deixar como eu já tinha feito, mas vou testar isso num próximo projeto para ver se consigo deletar em cascata.
Mesmo assim, muito obrigado.

____________________________________________________
Você sabe que alguém te ama não pelo que ele fala, mas pelo o que faz.
O amor não sobrevive de teorias.




 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PERCIFILHO em 20/08/2018 15:05:33