none
Editar dados EF+ASP.NET MVC 4 RRS feed

  • Pergunta

  • Boa tarde a todos, minha dúvida para editar um conteúdo no MVC 4 e EntityFramework, o formulário não vem setado comas informações da lista ele vem em branco:

    Meu Controller:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using CadeMeuMedico.Models;
    using System.Data.Entity;
    
    namespace CadeMeuMedico.Controllers.Medicos
    {
        public class MedicosController : Controller
        {
            //
            // GET: /Medicos/ 
            private Models.CadeMeuMedicoBD bd = new CadeMeuMedicoBD();
            
            public ActionResult Index()
            {
                var medicos = bd.Medicos.Include(m => m.Cidades).Include(m => m.Especialidades).ToList();
                return View(medicos);
            }
    
             public ActionResult Cadastro()
            {
                ViewBag.IDCidade = new SelectList(bd.Cidades, "IDCidade", "Nome");
                ViewBag.IDEspecialidade = new SelectList(bd.Especialidades,"IDEspecialidade","Nome");
    
                return View();
            }
    
             [HttpPost]
             public ActionResult Cadastro(CadeMeuMedico.Models.Medicos medico)
             { 
                if(ModelState.IsValid)
                {
                    bd.Medicos.Add(medico);
                    bd.SaveChanges();
                    return RedirectToAction("Index");
                }
                ViewBag.IDCidade = new SelectList(bd.Cidades, "IDCidade", "Nome", medico.IDCidade);
                ViewBag.IDCidade = new SelectList(bd.Cidades, "IDCidade", "Nome",medico.IDEspecialidade );
    
                return View(medico);
    
             }
    
             public ActionResult Editar(long id)
             {
                 try
                 {
                     CadeMeuMedico.Models.Medicos medico = bd.Medicos.Find(id);
                     id = 4;
                     ViewBag.IDCidade = new SelectList(bd.Cidades, "IDCidade", "Nome", medico.IDCidade);
                     ViewBag.IDEspecialidade = new SelectList(bd.Especialidades, "IDEspecialidade", "Nome", medico.IDEspecialidade);
                     return View(medico);
                 }
                 catch(Exception erro)
                 {
                     throw erro;
                 }
                 
             }
    
             [HttpPost]
             public ActionResult Editar(CadeMeuMedico.Models.Medicos medico)
             {
                 if (ModelState.IsValid)
                 {
                     bd.Entry(medico).State = System.Data.EntityState.Modified;
                     bd.SaveChanges();
                     return RedirectToAction("Index");
                 }
                 ViewBag.IDCidade = new SelectList(bd.Cidades, "IDCidade", "Nome", medico.IDCidade);
                 ViewBag.IDEspecialidade = new SelectList(bd.Especialidades, "IDEspecialidade", "Nome", medico.IDEspecialidade);
                 return View(medico);
             }
        }
    }

    quarta-feira, 13 de agosto de 2014 17:58

Respostas

  • Encontrei o erro, era no link editar faltava setar o id

     <td>
                @Html.ActionLink("Editar", "Editar", new { id = item.IDMedico }) 
    </td>
    Agora aparece esse erro:

    quinta-feira, 14 de agosto de 2014 19:50

Todas as Respostas

  • Raniel, pelo que vi no erro, parece que o seu parâmetro Id esta referência como opcional, o que não pode pois o EF entende que Id é a PK da tabela. 

    Em que ponto exato ocorre o erro?

    Abraço.

    quarta-feira, 13 de agosto de 2014 18:02
  • Sou novato no asp.net, esse erro está muito estranho não consigo encontrar o erro.
    quarta-feira, 13 de agosto de 2014 18:30
  • Faz um teste, troca esse linha:

     var medicos = bd.Medicos.Include(m => m.Cidades).Include(m => m.Especialidades).ToList();

    por esse:

     var medicos = bd.Medicos.Include("Cidades").Include("Especialidades").ToList();

    ve se dessa forma compila primeiro...

    quarta-feira, 13 de agosto de 2014 19:25
  • Nada amigo, mais eu acho que é o id que está indo nulo:

    System.ArgumentException: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.ActionResult Editar(Int64)' in 'CadeMeuMedico.Controllers.Medicos.MedicosController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
    Nome do parâmetro: parameters

    quarta-feira, 13 de agosto de 2014 20:34
  • Nada amigo, mais eu acho que é o id que está indo nulo:

    System.ArgumentException: The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.ActionResult Editar(Int64)' in 'CadeMeuMedico.Controllers.Medicos.MedicosController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
    Nome do parâmetro: parameters

    Raniel, você está usando Code First ou Data Base first? 

    Como está o seu Data Context? 

    Tem como postar o código? 

    É algo com a configuração da sua coluna ID.

    quarta-feira, 13 de agosto de 2014 20:40
  • Estou usando Database First :

    Meu Data Context:

    namespace CadeMeuMedico.Models
    {
        using System;
        using System.Data.Entity;
        using System.Data.Entity.Infrastructure;
        
        public partial class CadeMeuMedicoBD : DbContext
        {
            public CadeMeuMedicoBD()
                : base("name=CadeMeuMedicoBD")
            {
            }
        
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                throw new UnintentionalCodeFirstException();
            } 
        
            public virtual DbSet<Cidades> Cidades { get; set; }
            public virtual DbSet<Especialidades> Especialidades { get; set; }
            public virtual DbSet<Medicos> Medicos { get; set; }
            public virtual DbSet<Usuarios> Usuarios { get; set; }
        }
    }

    Minha tabela Médicos:

    quarta-feira, 13 de agosto de 2014 20:51
  • Ainda não consegui resolver...
    quinta-feira, 14 de agosto de 2014 18:00
  • Estou usando Database First :

    Meu Data Context:

    namespace CadeMeuMedico.Models
    {
        using System;
        using System.Data.Entity;
        using System.Data.Entity.Infrastructure;
        
        public partial class CadeMeuMedicoBD : DbContext
        {
            public CadeMeuMedicoBD()
                : base("name=CadeMeuMedicoBD")
            {
            }
        
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                throw new UnintentionalCodeFirstException();
            } 
        
            public virtual DbSet<Cidades> Cidades { get; set; }
            public virtual DbSet<Especialidades> Especialidades { get; set; }
            public virtual DbSet<Medicos> Medicos { get; set; }
            public virtual DbSet<Usuarios> Usuarios { get; set; }
        }
    }

    Minha tabela Médicos:

    Usando DataBase first era pra não estar dando o erro. 

    É algo com o Include. 

    Veja esses links: 

    http://stackoverflow.com/questions/7348663/c-sharp-entity-framework-how-can-i-combine-a-find-and-include-on-a-model-obje

    http://stackoverflow.com/questions/10009654/entityframework-calling-tolist-on-iqueryable-with-11-000-records-takes-10-s

    http://stackoverflow.com/questions/5521749/how-many-include-i-can-use-on-objectset-in-entityframework-to-retain-performance/5522195#5522195

    http://stackoverflow.com/questions/15764572/ef-linq-include-multiple-and-nested-entities

    Pelo que percebi você está tentando dar o include para os campos, porem a sua FK é not null, e você não está passando valor nenhum para elas. 

    Eu faço um insert mesmo.

    Medicos obj = new Medicos();
       // Adicione aqui todos os itens 
      obj.Nome = model.Nome;
      obj.IDEspecialidades = model.IdEspecialidades;
      
      // Adiciona o objeto ao Banco
      db.Medicos.Add(obj);
    
      // Salva a alteração no Banco
      db.SaveChanges();
    
       // Lista 
       var teste = db.Medicos.ToList();
    

    Prefiro adicionar a linha toda. 

    Espero que ajude.


    quinta-feira, 14 de agosto de 2014 18:26
  • Poderia explicar melhor?
    quinta-feira, 14 de agosto de 2014 19:01
  • Qual o valor que esta retornando no m.Cidades e m.Especialidades?

    quinta-feira, 14 de agosto de 2014 19:10
  • Qual o valor que esta retornando no m.Cidades e m.Especialidades?


    quinta-feira, 14 de agosto de 2014 19:15
  • Raniel vamos resolver esse BO. 

    Você debugou? viu em que linha o erro ocorre? 

    Mostra a linha e explique o que você deseja fazer. 

    Acho que fica mais fácil.

    quinta-feira, 14 de agosto de 2014 19:25
  • Encontrei o erro, era no link editar faltava setar o id

     <td>
                @Html.ActionLink("Editar", "Editar", new { id = item.IDMedico }) 
    </td>
    Agora aparece esse erro:

    quinta-feira, 14 de agosto de 2014 19:50
  • Show. 

    Que bom que resolveu.

    sexta-feira, 15 de agosto de 2014 12:38