none
Erro ao criar dados com chave estrangeira c# - Visual Studio RRS feed

  • Pergunta

  • Olá, não estou conseguindo inserir dados em uma tabela que tem chave estrangeira, segue meu model:

    TABELA FUNCIONARIO
    IdFuncionario
    Nome
    IdDepartamento

    TABELA DEPARTAMENTO
    IdDepartamento
    Nome


    2 tabelas, `Departamento` e `Funcionario`, o funcionário tem a chave estrangeira `IdDepartamento`.

    Gerei os `controllers` tudo certinho, eu consigo adicionar um departamento sem problemas.

    Quando vou adicionar um funcionário, o seguinte erro ocorre:

    "

    Entities in 'ModeloMVC4Container.Funcionarios' participate in the 'DepartamentoFuncionario' relationship. 0 related 'Departamento' were found. 1 'Departamento' is expected.


    Erro de Origem: 

    Linha 55:             {
    Linha 56:                 db.Funcionarios.Add(funcionario);
    Linha 57:                 db.SaveChanges();
    Linha 58:                 return RedirectToAction("Index");
    Linha 59:             }

     "

    o  `controller` do funcionario:

            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "IdFuncionario,Nome,IdDepartamento")] Funcionario funcionario)
            {
                if (ModelState.IsValid)
                {
                    db.Funcionarios.Add(funcionario);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(funcionario);
            }

    `Funcionarios Create Controller` para gerar a `ViewBag`: 

            // GET: Funcionarios/Create
            public ActionResult Create()
            {
                ViewBag.IdDepartamento = new SelectList(db.Departamentos, "IdDepartamento", "Nome");
                return View();
            }


    View `Create` do Funcionario:

                <div class="form-group">
                @Html.LabelFor(model => model.Nome, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control" } })
                    @Html.ValidationMessageFor(model => model.Nome, "", new { @class = "text-danger" })
                </div>
            </div>

            <div class="form-group">
                @Html.LabelFor(model => model.IdDepartamento, htmlAttributes: new { @class = "control-label col-md-2" })
                <div class="col-md-10">
                    @Html.DropDownList("IdDepartamento")
                </div>
            </div>


    Obrigado

    quinta-feira, 19 de novembro de 2015 11:50

Respostas

Todas as Respostas

  • Olá Felipe,

     você está preenchendo o "IdDepartamento"  ? Pelo erro parece que no insert não está, quando utiliza o debug o "idDepartamento" está preenchido ?

    quinta-feira, 19 de novembro de 2015 13:06
  • Olá Daniel, obrigado por responder, então, eu tava vendo meu código aqui e me dei conta que o tipo do IdDepartamento na tabela Funcionarios tava com nvarchar(max) kkkk , ai eu alterei para int() e no meu FuncionarioController eu coloquei assim:

                    var dp = db.Departamentos.Find(Convert.ToInt32(funcionario.IdDepartamento));
                    if (dp == null)
                    {
                        dp = new Departamento();
                    }
                    funcionario.Departamento = dp;

    ele funcionou e gravou, porem agora quando eu vou acessar a Index do Funcionario, ocorre o seguinte:

    The 'IdDepartamento' property on 'Funcionario' could not be set to a 'System.Int32' value. You must set this property to a non-null value of type 'System.String'.

    Erro de Origem: 

    Linha 19:         {
    Linha 20:             var funcionarios = db.Funcionarios.Include(f => f.Departamento);
    Linha 21:             return View(funcionarios.ToList());
    Linha 22:         }
    Linha 23: 


    Obrigado :)
    quinta-feira, 19 de novembro de 2015 13:27
  • rs acontece,

     provavelmente no seu Model essa propriedade está como string, altere na sua pasta "Model" essa propriedade que vai funcionar.

    quinta-feira, 19 de novembro de 2015 13:58
  • Olá Daniel, deu certo, obrigado!
    quinta-feira, 19 de novembro de 2015 16:31