Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diomar Rockenbach

Delete cascade no Entity Framework

Recommended Posts

Pessoal,

estou desenvolvendo um projeto utilizando .Net MVC 4 + entity framework e, estou apanhando para configurar delete cascade.

O modelo é o seguinte. Possuo uma narrativa, que pode ser pai de outra narrativa. Tenho aqui um autorelacionamento. Ai apenas narrativas filhas poderão ter capítulos. Para cada narrativa, tanto pai ou filha, vou ter uma imagem associada, que é uma imagem de capa. Apenas a narrativa pai vai ter uma lista de imagens.
A Narrativa filha pode ter varios capítulos, sendo que cada capitulo vai ter um lista de imagens.
O caso é que quando eu deletar uma narrativa, sendo pai ou filha, quero deletar tudo que estiver associado.

Minhas classes model são as seguintes:

[Serializable]
    [DisplayName("NarrativasAlunos")]
    public class Narrativa
    {
        public int ID { get; set; }

        public int? NarrativaPaiID { get; set; }
        public virtual Narrativa NarrativaPai { get; set; }

        [Required(ErrorMessage = "Campo Obrigatório")]
        [DisplayName("Titulo")]
        [MaxLength(100)]
        public string Titulo { get; set; } // UK

        [Required(ErrorMessage="Campo Obrigatório")]
        [DisplayName("Texto")]
        [DataType(DataType.MultilineText)]
        public string Texto { get; set; }

        public int? ImagemID { get; set; }
        public virtual Imagem Imagem { get; set; }

        public virtual ICollection<Narrativa> Narrativas { get; set; }
        public virtual ICollection<Imagem> Imagens { get; set; }
        public virtual ICollection<Capitulo> Capitulos { get; set; }

        public Narrativa()
        {
        }

        public Narrativa(Boolean MontaCapitulos)
        {
            this.Capitulos = new List<Capitulo>
            {
                new Capitulo(1),
                new Capitulo(2),
                new Capitulo(3),
                new Capitulo(4),
                new Capitulo(5),
                new Capitulo(6),
                new Capitulo(7)
            };
        }
    }

 


[Serializable]
    [DisplayName("Capitulos")]

    public class Capitulo
    {
        public int ID { get; set; }

        [Required(ErrorMessage = "Campo Obrigatório")]
        public int TipoCapitulo { get; set; } // UK com o campo idNarrativaAluno

        [DataType(DataType.MultilineText)]
        public String Texto { get; set; }

        public int? NarrativaPaiID { get; set; }
        public virtual Narrativa NarrativaPai { get; set; }

        public virtual ICollection<Imagem> Imagens { get; set; }

        public Capitulo(int TipoCapitulo)
        {
            this.TipoCapitulo = TipoCapitulo;
        }

        protected Capitulo()
        {

        }
    }

 

[Serializable]
    [DisplayName("ImagensNarrativa")]
    public class Imagem
    {
        [Key]
        public int ID { get; set; }

        [Required(ErrorMessage = "Campo Obrigatório")]
        public String Nome { get; set; }

        [Required(ErrorMessage = "Campo Obrigatório")]
        public String Caminho { get; set; }

        public virtual ICollection<Capitulo> Capitulos { get; set; }
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

De uma olhada, veja se funciona: http://blogs.msdn.com/b/alexj/archive/2009/08/19/tip-33-how-cascade-delete-really-works-in-ef.aspx
Nunca testei. Caso não, o jeito seria fazer manualmente, algo como isso: http://stackoverflow.com/questions/9005948/entity-framework-on-delete-cascade

Abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Brother,

 

Não é o jeito + bonito de se fazer, mas funciona.

 

Veja os código abaixo:

 

Categoria.sql

 

USE MASTER
GO
 
DROP DATABASE DEMO
GO
 
CREATE DATABASE DEMO
GO
 
USE DEMO
GO
 
CREATE TABLE CATEGORIA(
ID INT NOT NULL IDENTITY,
TITULO NVARCHAR(100) NOT NULL,
IDCATEGORIAPAI INT NULL DEFAULT NULL,
CONSTRAINT PK_CATEGORIA PRIMARY KEY(ID),
CONSTRAINT FK_CATEGORIA_PAI FOREIGN KEY(IDCATEGORIAPAI)
REFERENCES CATEGORIA(ID)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT UQ_TITULO UNIQUE(TITULO)
);
 
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('ABC', NULL);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('DEF', NULL);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('GHI', NULL);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('JKL', NULL);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('MNO', NULL);
 
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('PQR', 1);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('STU', 1);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('VWX', 3);
INSERT INTO CATEGORIA(TITULO, IDCATEGORIAPAI) VALUES('XYZ', 3);
 
SELECT * FROM CATEGORIA;

 

DALCategoria.cs

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace DeleteAutoRelacionamento
{
    public class DALCategoria
    {
        public void ApagaCategoria(int idCategoria)
        {
            using (DEMOEntities context = new DEMOEntities())
            {
 
                var categoriaFilha = (from c in context.CATEGORIA
                                      where c.IDCATEGORIAPAI == idCategoria
                                      select c).ToList();
                foreach (var categoria in categoriaFilha)
                {
                    context.CATEGORIA.DeleteObject(categoria);
                }
 
                var objCategoria = (from c in context.CATEGORIA where c.ID == idCategoria select c).FirstOrDefault();
                if (objCategoria != null)
                {
                    context.CATEGORIA.DeleteObject(objCategoria);                    
                }
                context.SaveChanges();
            }
        }
    }
}
 

 

Program.cs

 

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                DALCategoria dal = new DALCategoria();
                dal.ApagaCategoria(3);
                Console.WriteLine("concluido");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally {
                Console.Read();
            }
        }
    }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.