public Curso GetById(int id)
 {
     using (var db = new AppDBContext())
     {
         return db.Cursos.Find(id);
     }
 }
 public List<Inscricao> GetByEstudanteId(int estudanteId)
 {
     using (var db = new AppDBContext())
     {
         return db.Inscricoes.Include(i => i.Curso).Where(i => i.EstudanteId == estudanteId).ToList();
     }
 }
 public List<Estudante> GetAll()
 {
     using (var db = new AppDBContext())
     {
         return db.Estudantes.ToList();
     }
 }
 public List<Professor> GetAll()
 {
     using (var db = new AppDBContext())
     {
         return db.Professores.ToList();
     }
 }
 public Professor GetById(int id)
 {
     using (var db = new AppDBContext())
     {
         return db.Professores.Find(id);
     }
 }
 public Estudante GetById(int id)
 {
     using (var db = new AppDBContext())
     {
         return db.Estudantes.Find(id);
     }
 }
 public List<Curso> GetAll()
 {
     using (var db = new AppDBContext())
     {
         return db.Cursos.ToList();
     }
 }
 public void Create(Estudante estudante)
 {
     using (var db = new AppDBContext())
     {
         db.Estudantes.Add(estudante);
         db.SaveChanges();
     }
 }
 public void Edit(Estudante estudante)
 {
     using (var db = new AppDBContext())
     {
         db.Entry(estudante).State = System.Data.Entity.EntityState.Modified;
         db.SaveChanges();
     }
 }
 public void Create(Professor professor)
 {
     using (var db = new AppDBContext())
     {
         db.Professores.Add(professor);
         db.SaveChanges();
     }
 }
 public void Edit(Professor professor)
 {
     using (var db = new AppDBContext())
     {
         db.Entry(professor).State = EntityState.Modified;
         db.SaveChanges();
     }
 }
 public void Delete(int id)
 {
     using (var db = new AppDBContext())
     {
         Professor professor = db.Professores.Find(id);
         db.Professores.Remove(professor);
         db.SaveChanges();
     }
 }
        public void CadastrarEstudante(Inscricao inscricao)
        {
            using (var db = new AppDBContext())
            {
                inscricao.DataInscricao = DateTime.Now;

                db.Inscricoes.Add(inscricao);
                db.SaveChanges();
            }
        }
        public void Create(Curso curso, int[] professores)
        {
            using (var db = new AppDBContext())
            {
                curso.Professores = db.Professores.Where(p => professores.Contains(p.Id)).ToList();

                db.Cursos.Add(curso);

                db.SaveChanges();
            }
        }
        public void Delete(int id)
        {
            using (var db = new AppDBContext())
            {
                Curso curso = db.Cursos.Find(id);

                db.Cursos.Remove(curso);

                db.SaveChanges();
            }
        }
        public void Delete(int id)
        {
            using (var db = new AppDBContext())
            {
                var estudante = db.Estudantes.Find(id);

                db.Estudantes.Remove(estudante);

                db.SaveChanges();
            }
        }
        public Professor GetByIdWithCursos(int id)
        {
            using (var db = new AppDBContext())
            {
                var professor = db.Professores.Include(p => p.Cursos).SingleOrDefault(p => p.Id == id);

                foreach (var c in professor.Cursos)
                {
                    c.Professores = null;
                }

                return professor;
            }
        }
        public void Edit(Curso curso, int[] professores)
        {
            using (var db = new AppDBContext())
            {
                var cursoDb = db.Cursos.Include(c => c.Professores).Single(c => c.Id == curso.Id);

                cursoDb.DataLimiteInscricao = curso.DataLimiteInscricao;
                cursoDb.Descricao = curso.Descricao;
                cursoDb.Nome = curso.Nome;

                AtualizarProfessoresCurso(cursoDb, professores, db);

                db.SaveChanges();
            }
        }
        public Curso GetByIdWithProfessores(int id)
        {
            using (var db = new AppDBContext())
            {
                var curso = db.Cursos
                              .Include(i => i.Professores)
                              .SingleOrDefault(c => c.Id == id);

                foreach (var p in curso.Professores)
                {
                    p.Cursos = null;
                }

                return curso;
            }
        }
        public Estudante GetByIdWithInscricoes(int id)
        {
            using (var db = new AppDBContext())
            {
                var estudante = db.Estudantes
                                  .Include(e => e.Inscricoes.Select(i => i.Curso))
                                  .SingleOrDefault(e => e.Id == id);

                foreach (var i in estudante.Inscricoes)
                {
                    i.Curso.Inscricoes = null;
                    i.Estudante = null;
                }

                return estudante;
            }
        }
        private void AtualizarProfessoresCurso(Curso curso, int[] professores, AppDBContext db)
        {
            if (professores == null)
            {
                curso.Professores = new List<Professor>();
                return;
            }

            //Lista dos professores que estão selecionados
            var professoresAdicionar = db.Professores.Where(p => professores.Contains(p.Id))
                                                     .ToList();
            //Remove todos os professores que já estão associados ao curso
            professoresAdicionar.RemoveAll(p => curso.Professores.Any(cp => cp.Id == p.Id));
            professoresAdicionar.ForEach(p => curso.Professores.Add(p));

            //Lista de professores que estão associados ao curso mas não estão selecionados
            var professoresRemover = curso.Professores.Where(p => !professores.Contains(p.Id)).ToList();
            professoresRemover.ForEach(p => curso.Professores.Remove(p));
        }