Delete cascade no Entity Framework

04/02/2013

0

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; }
    }
Diomar Rockenbach

Diomar Rockenbach

Responder

Posts

04/02/2013

Robson Alves

Qual a versão do EF vc está usando?
Responder

04/02/2013

Diomar Rockenbach

versão v4.0.30319
Responder

04/02/2013

Robson Alves

Diomar,

veja se te ajuda cara:

http://mleder.blogspot.com.br/2010/05/entity-framework-4-cascaded-delete-in.html
Responder

04/02/2013

Diomar Rockenbach

Robson,

Da forma como estou utilizando aqui, eu não tenho a parte visual. os relacionamentos são feitos via model mesmo ou no DefaultContext, como abaixo:

    public class DefaultContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public DbSet<Role> Roles { get; set; }

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

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            // Maps to the expected many-to-many join table name for roles to users.
            modelBuilder.Entity<User>()
            .HasMany(u => u.Roles)
            .WithMany(r => r.Users)
            .Map(m => {
                m.ToTable("RoleMemberships");
                m.MapLeftKey("UserName");
                m.MapRightKey("RoleName");
            });

            modelBuilder.Entity<Capitulo>()
            .HasMany(u => u.Imagens)
            .WithMany(r => r.Capitulos)
            .Map(z =>
            {
                z.ToTable("CapitulosImagens");
                z.MapLeftKey("CapituloID");
                z.MapRightKey("ImagemID");
            });

            //modelBuilder.Entity<Narrativa>()
            //.HasOptional(p => p.Narrativas).WithMany( .WillCascadeOnDelete();
            ////.WillCascadeOnDelete(true);
        }
    }


Eu cheguei a encontrar alguns sites com exemplo de como fazer, mas esbarrei em um problema, de estar criando referências circulares. Isso por que tenho um auto relacionamento na tabela narrativa. Desta forma, o SQL Server já barra na hora da crição das tabelas.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar