none
Delete cascade no Entity Framework RRS feed

  • Pergunta

  • 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; }
        }

    segunda-feira, 4 de fevereiro de 2013 17:27

Todas as Respostas

  • O Cascade é no SQL, a partir do momento que vc coloca chaves estrangeiras ele ja configura como padrão o cascade.

    Caso isso não esteja acontecendo vc vai ter que adicionar pelo Manager do SQL.


    Paulo Marcelo Dalbosco

    segunda-feira, 4 de fevereiro de 2013 17:39
  • Não vi vc declarar as chaves estrangeiras.

    olha o exemplo:

    [ForeignKey("Customer")]
        public string CustomerID { get; set; }
        public virtual Customer Customer { get; set; }


    Paulo Marcelo Dalbosco

    segunda-feira, 4 de fevereiro de 2013 17:46
  • O exemplo abaixo serviu para o meu caso, no database context no metodo OnModelCreating você deve criar o relacionamento e setar 
    a propriedade de delete on cascade.

    public class Student

    {
        public virtual int StudentId { get; set; }
        public virtual Anamnesis Anamnesis { get; set; }
    }

    public class Anamnesis
    {
        public int AnamnesisId { get; set; }
        public virtual Student Student { get; set; }
    }

    public class Context : DbContext
    {
        public DbSet<Student> Students { get; set; }
        public DbSet<Anamnesis> Anamnesises { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Student>()
                        .HasRequired(s => s.Anamnesis)
                        .WithRequiredPrincipal(a => a.Student)
                        .WillCascadeOnDelete();
        }
    }


    terça-feira, 5 de fevereiro de 2013 12:17